Как изменить путь к текущему каталогу в bash

Я пытаюсь настроить приглашение 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, но это тоже не дало мне того, что я хочу.

Stack Overflow предназначен для вопросов по программированию. Возможно, вы захотите изучить наш родственный сайт Unix & Linux , но, пожалуйста, прочитайте их справочные страницы, прежде чем спрашивать там (и, пожалуйста, удалите этот пост не по теме и просмотрите наш справочный центр, прежде чем публиковать здесь снова). При этом у нас уже есть немало вопросов по быстрой настройке Bash; пожалуйста, поищите, прежде чем спрашивать.

tripleee 27.05.2024 15:56

Как узнать, что такое «основной каталог моего проекта»? Каталог /projecta/projectb/projectc что должно появиться?

KamilCuk 27.05.2024 19:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, это поможет. Постарайтесь разбить детали на более мелкие части.

  1. Как распечатать имя пользователя?
  2. Как распечатать каталог проекта верхнего уровня?
  3. Как распечатать текущий каталог проекта относительно верхнего уровня?
  4. Как распечатать рабочий каталог (комбинацию верхнего уровня и текущего каталога)?
  5. Как распечатать название филиала?

Сообщение предлагает __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.

topsail 27.05.2024 19:32

Я полагаю, что одна из проблем заключается в том, что происходит, когда вы используете bash вне проекта git - приведет ли это к сбою вашей командной строки bash?

topsail 27.05.2024 19:49

добавляю заявление об отказе от ответственности git, надеюсь, это кому-то поможет.

atl 27.05.2024 21:45

@xpt, кнопка «против» имеет наводящий текст. Если нет ничего более явного, это ваша причина по умолчанию.

Charles Duffy 28.05.2024 13:27

Кроме того: function funcname() { объединяет устаревший ksh и синтаксис POSIX таким образом, что становится ненужной несовместимостью как с устаревшим ksh, так и со спецификацией POSIX. Отбросьте ключевое слово function, чтобы обеспечить совместимость с POSIX, или отбросьте (), чтобы обеспечить (вроде как) совместимость с ksh 1980-х годов. (Настоящий ksh меняет семантику объявления функции в зависимости от того, какой формат используется; bash не учитывает этот выбор, что, возможно, делает устаревший синтаксис запутанным для людей, которые знают ksh).

Charles Duffy 28.05.2024 13:29

Есть много способов. Мой любимый (самый мощный) метод — использование силы переменной 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'

Детали вы можете установить на свой вкус, я просто хочу показать направление:

  1. экспортировать переменные с помощью базовых приемов
  2. забери их в PS1
  3. используйте PROMPT_COMMAND для постоянного обновления;)
PROMPT_COMMAND не нужно экспортировать и, возможно, не должно быть: если оболочка дочернего процесса наследует PROMPT_COMMAND, но не наследует используемые функции, она выдаст ошибки. Оставьте ее как обычную переменную оболочки, а не переменную среды; таким образом, дочерние процессы могут получить его, запустив сами, если захотят.
Charles Duffy 27.05.2024 22:59

(PS1 также не нужно экспортировать по той же причине; и я бы сказал, что у вас также нет веской причины для экспорта exported_dir - зачем использовать пространство среды, которое поступает из ограниченного пула для каждого процесса, совместно используемого с аргументы командной строки для чего-то, что отлично работало бы, если бы вместо этого хранилось в куче?).

Charles Duffy 27.05.2024 23:00

@CharlesDuffy, ты, наверное, прав. Мой export происходит от моего .bashrc и его зависимостей - с высокой степенью настройки. Хотя окончательную форму @nabil-yasser может выбрать самостоятельно. В любом случае - вы дали хороший совет.

linux_beginner 28.05.2024 13:22

Другие вопросы по теме