Я пытаюсь настроить приглашение bash, и вот что мне кажется идеальным:
PS1='\n\[\033[32m\]\h \[\033[33m\]\w\[\033[36m\]`__git_ps1`\[\033[0m\]\n'
Я хочу, чтобы текущий путь начинался только с родительского каталога, например, я хочу это:
username /e/dir1/_workspace/projectDir (master)
Быть этим:
username projectDir (master)
А projectDir
— это основной каталог моего текущего проекта.
Кроме того, когда я углубляюсь, я хочу, чтобы вывод был относительно родительского каталога следующим образом:
username projectDir/Dir_x/Dir_y (master)
Есть ли способ добиться этого?
Я пытался использовать cd
вместо \W
, но это показывало только текущий каталог, даже если я \w
глубже.
Я тоже пробовала cd
, но это тоже не дало мне того, что я хочу.
Как узнать, что такое «основной каталог моего проекта»? Каталог /projecta/projectb/projectc
что должно появиться?
Возможно, это поможет. Постарайтесь разбить детали на более мелкие части.
Сообщение предлагает __git_ps1
, что может означать, что переменная среды уже существует. Кроме того, ветка master
(значение по умолчанию в git) предполагает, что, возможно, все дело в git
.
Если git
— это не то, что вы ищете, то ценность этого поста может заключаться в том, что он представляет рецепт создания решения с использованием инструмента, который сообщает указанные переменные: username
, project dir
, relative dir
и branch name
.
function ps1_username() { echo "username"; }
function ps1_top_level() { basename $(git rev-parse --show-toplevel); }
function ps1_show_prefix() { git rev-parse --show-prefix; }
function ps1_working_dir() { echo $(ps1_top_level)/$(ps1_show_prefix); }
function ps1_branch() { git rev-parse --abbrev-ref HEAD; }
PS1='\n\[\033[32m\]$(ps1_username)\n'
PS1='\n\[\033[33m\]$(ps1_top_level)\n'
PS1='\n\[\033[33m\]$(ps1_show_prefix)\n'
PS1='\n\[\033[33m\]$(ps1_working_dir)\n'
PS1='\n\[\033[36m\]$(ps1_branch)\n'
# ALL TOGETHER NOW
PS1='\n\[\033[32m\]$(ps1_username) \[\033[33m\]$(ps1_working_dir) \[\033[36m\]$(ps1_branch)\[\033[0m\]\n'
Ожидаемый результат:
username projectDir/Dir_x/Dir_y/ develop
Это кажется многообещающим, если предположить, что «каталог проекта» можно определить как корень проекта git. Я не уверен, почему за него проголосовали. Но, вероятно, вам следует указать в ответе, что это работает только в том случае, если это правда — корнем проекта является репозиторий git.
Я полагаю, что одна из проблем заключается в том, что происходит, когда вы используете bash вне проекта git - приведет ли это к сбою вашей командной строки bash?
добавляю заявление об отказе от ответственности git
, надеюсь, это кому-то поможет.
@xpt, кнопка «против» имеет наводящий текст. Если нет ничего более явного, это ваша причина по умолчанию.
Кроме того: function funcname() {
объединяет устаревший ksh и синтаксис POSIX таким образом, что становится ненужной несовместимостью как с устаревшим ksh, так и со спецификацией POSIX. Отбросьте ключевое слово function
, чтобы обеспечить совместимость с POSIX, или отбросьте ()
, чтобы обеспечить (вроде как) совместимость с ksh 1980-х годов. (Настоящий ksh меняет семантику объявления функции в зависимости от того, какой формат используется; bash не учитывает этот выбор, что, возможно, делает устаревший синтаксис запутанным для людей, которые знают ksh).
Есть много способов. Мой любимый (самый мощный) метод — использование силы переменной PROMPT_COMMAND
. Имея в виду, что вы можете хранить десятки файлов .bashrc
, поместите следующие файлы в один, который вы используете в своем сеансе git:
export_dir_name () {
export exported_dir=${PWD/`git rev-parse --show-toplevel`/}
# you might want to do smth more with value before exporting - it's up to u
}
export_ps1 () {
export PS1 = "\[\033[32m\]\h \[\033[33m\]$exported_dir\[\033[36m\]`__git_ps1`\[\033[0m\] "
unset exported_dir # you can throw away this line - it's up to u
}
export PROMPT_COMMAND='export_dir_name && export_ps1'
Детали вы можете установить на свой вкус, я просто хочу показать направление:
PROMPT_COMMAND
не нужно экспортировать и, возможно, не должно быть: если оболочка дочернего процесса наследует PROMPT_COMMAND, но не наследует используемые функции, она выдаст ошибки. Оставьте ее как обычную переменную оболочки, а не переменную среды; таким образом, дочерние процессы могут получить его, запустив сами, если захотят.
(PS1
также не нужно экспортировать по той же причине; и я бы сказал, что у вас также нет веской причины для экспорта exported_dir
- зачем использовать пространство среды, которое поступает из ограниченного пула для каждого процесса, совместно используемого с аргументы командной строки для чего-то, что отлично работало бы, если бы вместо этого хранилось в куче?).
@CharlesDuffy, ты, наверное, прав. Мой export
происходит от моего .bashrc
и его зависимостей - с высокой степенью настройки. Хотя окончательную форму @nabil-yasser может выбрать самостоятельно. В любом случае - вы дали хороший совет.
Stack Overflow предназначен для вопросов по программированию. Возможно, вы захотите изучить наш родственный сайт Unix & Linux , но, пожалуйста, прочитайте их справочные страницы, прежде чем спрашивать там (и, пожалуйста, удалите этот пост не по теме и просмотрите наш справочный центр, прежде чем публиковать здесь снова). При этом у нас уже есть немало вопросов по быстрой настройке Bash; пожалуйста, поищите, прежде чем спрашивать.