Bash: статус выхода Дисплея в подсказке:

Если необходимо переименовать файлы в подкаталогах также и Вашем find поддержки -execdir предикат, затем можно сделать

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

Благодарите @glenn jackman для предложения -depth опция для find и заставить меня думать.

Обратите внимание на это в некоторых системах (включая GNU/Linux), find может не найти файлы, имя которых содержит пробелы и также последовательности байтов, которые не формируют допустимые символы (типичный с медиа-файлами с именами с символами неASCII, закодированными в наборе символов, отличающемся от локали). Установка локали к C (как в LC_ALL=C find...) решил бы проблему.

11
01.03.2011, 16:49
6 ответов

Gilles определил Вашу основную проблему, но я хотел попытаться объяснить это по-другому.

Bash интерпретирует специальные быстрые Escape только прежде, чем развернуть любые переменные в подсказке. Это означает то использование \e в переменной, которая расширена от подсказки, не работает, даже при том, что она действительно работает непосредственно в PS1.

Например, это работает как ожидалось и дает красный текст:

PS1='\e[1;31m this is in red '

Но это не делает, это просто помещает литерал \e в подсказке:

RED='\e[1;31m'
PS1="$RED not in red "

Если Вы хотите сохранить цветные Escape в переменных, можно использовать ANSI-C, заключающий в кавычки ($'...') помещать литеральный символ ESC в переменную.

Чтобы сделать это, можно изменить определение GREEN, RED, и NONE, таким образом, их значение является фактической escape-последовательностью.

GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'

Если Вы делаете это, Ваше первое PS1 с одинарными кавычками должен работать:

PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '

Однако затем у Вас будет вторая проблема.

Попытайтесь выполнить это, затем нажмите Up Arrow, затем Домой, и Ваш курсор не вернется к запуску строки.

Зафиксировать это, изменение PS1 включать \[ и \] вокруг цветных escape-последовательностей, например.

PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '

Вы не можете использовать get_exit_status правильно здесь, так как его вывод содержит обе печати (код выхода) и непечатаемые символы (цветовые коды), и нет никакого способа отметить его правильно в подсказке. Помещение \[...\] отметил бы его как непечатаемый полностью, который не корректен. Необходимо будет изменить функцию так, чтобы она только распечатала надлежащий цветовой код, и затем окружите ее \[...\] в подсказке.

8
27.01.2020, 19:58
  • 1
    \[ \1, и \[ \2. Те, которые к, соответствуют некоторому readline's RL_PROMPT_{START,END}_IGNORE вещь, которая просит, чтобы это проигнорировало байты при подсчете быстрой длины на экран. См. lists.gnu.org/archive/html/bug-bash/2015-08/msg00027.html. –  Arthur2e5 27.10.2015, 20:53
  • 2
    @Arthur2e5 Делает Вы имеете в виду \] \2? И Вы имеете в виду вот почему, что это необходимо для ${exitStatus}? Моя точка была этим ${exitStatus} не содержит непечатаемые символы, таким образом, удар должен смочь правильно определить, сколько символов он перемещает подсказку без \[ и \] в \[${exitStatus}\]. –  Mikel 27.10.2015, 21:13
  • 3
    Проблема - это, действительно содержит некоторых - цвета. (Escape ANSI) –  Arthur2e5 27.10.2015, 21:28
  • 4
    @Arthur2e5 Ew, я полностью пропустил это.:) Почему был бы Вы помещать цвета... неважно. :) –  Mikel 27.10.2015, 21:46

Когда Вы работаете PS1='${RED}\h $(get_path) ${exitStatus}${NONE} ', PS1 переменная установлена на ${RED}\h $(get_path) ${exitStatus}${NONE}, где только \h быстрая escape-последовательность. После того, как быстрые последовательности расширены (получение ${RED}darkstar $(get_path) ${exitStatus}${NONE}), оболочка выполняет обычные расширения, такие как переменные расширения. Вы получаете отображенную подсказку, которая похожа \e[1;31mdarkstar PATH 0\e[m. Ничто по пути не расширяется \e последовательности к фактическим символам ESC.

Когда Вы работаете PS1="${RED}\h $(get_path) ${exitStatus}${NONE} ", PS1 переменная установлена на \e[1;31m\h PATH 0\e[m. Переменные RED, exitStatus и NONE расширены во время присвоения. Затем подсказка содержит три быстрых escape-последовательности (\e, \h, и \e снова). Нет никаких переменных оболочки для расширения на данном этапе.

Для наблюдения цветов Вам нужны цветные переменные для содержания фактических символов ESC. Можно сделать это этот путь:

RED=$'\033[1;31m'
NONE=$'\033[m'
PS1='\[${RED}\]\h \w $?\[${NONE}\] '

$'…' разворачивает восьмеричные обратной косой чертой последовательности и некоторые последовательности буквы обратной косой черты такой как \n, но не включая \e. Я внес три других изменения в Вашу подсказку:

  • Использовать \[…\] вокруг непечатаемых последовательностей, таких как изменяющие цвет команды. Иначе Ваш дисплей закончится искаженный, потому что удар не может выяснить ширину подсказки.
  • \w встроенная escape-последовательность должна распечатать текущий каталог.
  • Вам не нужно ничто сложное для показа $? в подсказке, если у Вас нет a PROMPT_COMMAND во-первых.
3
27.01.2020, 19:58
  • 1
    я думаю идея, должен был заставить подсказку быть зеленой на успехе и красном при отказе. –  mattdm 03.03.2011, 03:20
  • 2
    Да, PS1 является неправильным, но совет использовать $'...' для RED и GREEN должен заставить его работать с помощью dogbane's PS1. гибкость –  Mikel 03.03.2011, 04:05

Попытка:

PS1='`exitStatus=$?;if [ $exitStatus -eq 0 ];then echo "\['${GREEN}'\]";else echo "\['${RED}'\]";fi;echo "\h $(get_path) ${exitStatus}${NONE}"`'
1
27.01.2020, 19:58
  • 1
    Спасибо, это работает, но является там каким-либо способом выполнить это, не имея необходимость встраивать оператор "if" в рамках подсказки? –  dogbane 02.03.2011, 10:34

Здесь Вы идете - Это Работы Для Me(TM) в Ubuntu и других Linux (Linuxen?).

Причина того, чтобы вставить обнаружение кода выхода $PS1 тот один хост, имеет только для чтения $PROMPT_COMMAND набор прежде .bashrc читается.

1
27.01.2020, 19:58

Вот подход, с которым я пошел, он избегает использования PROMPT_COMMAND.

# This function is called from a subshell in $PS1,
# to provide a colourised visual indicator of the exit status of the last run command
__COLOURISE_EXIT_STATUS() {
    # uncomment the next line for exit code output after each command, useful for debugging and testing
    #printf -- "\nexit code: $1\n" >&2
    [[ 0 == "$1" || 130 == "$1" ]] && printf -- "$GREEN" || printf -- "$RED"
}

Затем мой $PS1 следующие:

PS1='# ${debian_chroot:+($debian_chroot)}'"${GREEN}\u${YELLOW}@${DARK_YELLOW}\h${WHITE}:${LIGHT_BLUE}\w${WHITE}\n"'\[$(__COLOURISE_EXIT_STATUS $?)\]# \$'"\[${WHITE}\] "
1
27.01.2020, 19:58
  • 1
    В то время как это не имеет значения в данном случае как единственное значение $? может иметь целое число, действительно необходимо использовать printf '%b' "$GREEN" вместо этого. Кроме того, избегайте использования имен функций, снабженных префиксом __ или _ поскольку они используются завершением удара. –  nyuszika7h 12.06.2014, 20:18

Для PROMPT_COMMAND чище определить функцию и использовать:

prompt_command() {
    # ...
}
PROMPT_COMMAND=prompt_command
0
27.01.2020, 19:58

Теги

Похожие вопросы