При настройке .bashrc в Windows для Git Bash, почему функция в PS1 показывает имя функции, а не вычисляет?

#bash #ps1

#bash #ps1

Вопрос:

Ниже приведено то, что у меня сейчас есть в файле .bashrc, расположенном в моем домашнем каталоге.

 parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* (.*)/ (1)/';
}

PS1='n'                                        # New line
PS1=$PS1'[33[01;32m]u'                     # Username
PS1=$PS1' [33[00m]at [33[01;35m]h'     # at Hostname
PS1=$PS1' [33[00m]in [33[01;36m]W'     # in Directory
PS1=$PS1'[33[01;33m]$(parse_git_branch)'   # Git branch
PS1=$PS1'[33[00m]n$ '                     # New line and prompt

export PS1
 

Это приглашение bash должно быть

 user at host in ~ (main)
$ 
 

когда в основной ветви репозитория git в моем домашнем каталоге. Вместо этого приглашение bash

 user at host in ~$(parse_git_branch)
$
 

Функция в определении PS1 просто отображается в виде текста в приглашении, а не оценивается.

У кого-нибудь есть представление о том, почему это происходит?

Редактировать:

При изменении строки, вызывающей функцию, для использования двойных кавычек и удаления косой черты перед вызовом, как показано ниже,

 PS1=$PS1"[33[01;33m]$(parse_git_branch)"
 

ветка git отображается правильно при первом открытии bash, но не обновляется. Если я изменю строку, вызывающую функцию, чтобы по-прежнему использовать двойные кавычки, но включить косую черту или использовать одинарные кавычки без косой черты, как показано ниже,

 PS1=$PS1"[33[01;33m]$(parse_git_branch)"
PS1=$PS1'[33[01;33m]$(parse_git_branch)'
 

При открытии bash я получаю следующую ошибку,

 $ bash
bash: command substitution: line 1: syntax error near unexpected token `)'
bash: command substitution: line 1: `parse_git_branch)'
 

EDIT2:

Проблема была исправлена путем изменения строки, вызывающей функцию, на

 PS1=$PS1'[33[01;31m]`parse_git_branch`'
 

как показано здесь.

Комментарии:

1. Помогает ли это ?

2. Вы пытаетесь использовать две крайности: дважды экранировать $ , заключая его в одинарные кавычки и добавляя к нему обратную косую черту, и вообще не экранировать его внутри двойных кавычек. Ее нужно экранировать один раз : либо в одинарных кавычках без дополнительной обратной косой черты, либо в двойных кавычках с обратной косой чертой. (Ошибка в вашем редактировании вызвана чем-то другим; что, непонятно.)

3. Вам также не нужно экспортировать PS1 ; любая оболочка, которая заботится о своем значении, уже является источником .bashrc .

4. Ошибка в первой строке предполагает, что проблема определяется parse_git_branch в первую очередь, а не ваша попытка использовать ее в приглашении.

5. @Michael Kistler: если вы найдете ответ на свой собственный вопрос, вы можете опубликовать его как ответ (и выбрать его как правильный ответ!) Вместо редактирования вашего вопроса 🙂