1

Пояснение: я хочу, чтобы __foo выполнялся каждый раз, когда строка PS1 представлена в терминале, а не когда строка PS1 создается (следовательно, она в кавычках). __foo содержит логику, которая проверяет текущий каталог, поэтому его выполнение должно быть отложено.


Я пытаюсь использовать разные цвета в моей строке Bash PS1 из функции Bash:

LIGHTRED="\033[1;31m"
LIGHTGREEN="\033[1;32m"
RESET="\033[m"

__foo () {
    # Do some stuff and genereate a string to echo in different colours:
    echo -n '\['$1'\]firstcolour \['$2'\]secondcolour'
}

PS1='$(__foo '$LIGHTRED' '$LIGHTGREEN')\['$RESET'\] \$'

По сути, я хочу, чтобы __foo генерировал часть PS1 в связке разных цветов. Моя попытка, похоже, не работает, хотя; он производит следующий вывод:

-bash: 31m: command not found
-bash: 32m: command not found
\[]firstcolour \[\]secondcolour $

Что дает, и как я могу это исправить?

3 ответа3

2

Используйте переменную среды Bash $ PROMPT_COMMAND, чтобы переопределить переменную $ PS1 непосредственно перед отображением приглашения.

LIGHTRED='\033[1;31m'
LIGHTGREEN='\033[1;32m'
RESET='\033[m'

__foo () {
  # Do some stuff and genereate a string to echo in different colours:
  echo -n "\[$1\]firstcolour \[$2\]secondcolour"
}

PROMPT_COMMAND=$PROMPT_COMMAND'; PS1="$(__foo $RED $GRN)\[$OFF\]\n\$ "'

Обратите внимание, что два дополнительных изменения, которые я внес в ваш код, не являются обязательными. Они были добавлены, потому что я думаю, что это разъясняет, где / где не раскрываются escape-коды:

  • Жесткие кавычки ' переменных определения цвета.
  • Мягкие кавычки " вокруг возвращаемой строки для __foo
1

Ваша функция foo возвращает строку, которая выполняется bash в качестве команды, поскольку вы окружили ее $() (и избежали замены всех переменных одинарными кавычками.

Изменив код на этот, он будет работать нормально:

LIGHTRED="\033[1;31m"
LIGHTGREEN="\033[1;32m"
RESET="\033[m"

__foo () {
  # Do some stuff and genereate a string to echo in different colours:
  echo -n '\['$1'\]firstcolour \['$2'\]secondcolour'
}

PS1=$(__foo $LIGHTRED $LIGHTGREEN)\[$RESET\]\$
0

Я решил это:

LIGHTRED="\033[1;31m"
LIGHTGREEN="\033[1;32m"
RESET="\033[m"

__foo () {
    # Do some stuff and genereate a string to echo in different colours:
    echo -n '\['$1'\]firstcolour \['$2'\]secondcolour'
}

PS1='$(__foo "'$LIGHTRED'" "'$LIGHTGREEN'")\['$RESET'\] \$'

Аргументы __foo должны быть заключены в кавычки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .