Как вставить bash-скрипты в переменную PS1
Я сделал собственную переменную PS1, что очень запутанно. Вот тот, который наиболее близок к полноценной работе:
PS1 = "\ n [\ e [1; 31 м]\u@\H[\e[35 м] \@ [\e[32 м] PWD: \w [\e[1;34 м] В этой папке есть \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's:::g') файлы [\e[1;33m] Всего \$(/bin/ls -lah | /bin/grep -m 1 всего | /bin/sed 's/total //')b\n`if [ \$? = 0 ], затем echo [\e[32m]^_^ [\e[0m] Сработало - [\e[0m]; еще эхо [\e[31m]O_O[\e[0m] не сработало -; fi`"
Это тот же код, что и в предыдущем примере кода, но он был разделен на блоки и прокомментирован для лучшей читаемости:
#User@Host [Red]
\n\[\e[1;31m\]\u@\H
#Hour [Purple]
\[\e[35m\] \@
#PWD [Green]
\[\e[32m\] PWD: \w
#Number of files in PWD [Blue]
\[\e[1;34m\]This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files
#Amount of space the PWD files take, also line break [Yellow]
\[\e[1;33m\]A total of \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n
#Malfunctioning condition, should smile if the instruction went right, or poker-face if not [green and red]
\`if [ \$? = 0 ]; then echo \[\e[32m\]^_^ \[\e[0m\]\[\e[0m\]Worked - \[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\] Didn't worked - ; fi\`
Попытка объяснить проблему:
if
ищет условие, которое больше не может быть ложным после запуска (например,)"This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files"
, как это верно, если у последнего утверждения был чистый конец.
Как я могу заставить его работать, в то же время сохраняя вывод в том же положении? Если if передвигается до выполнения первой команды, он работает нормально.
Я думал о присвоении переменной с этим if
состояние в начале PS1. Тогда другие if
по этой позиции можно судить об альтернативной переменной, которая не изменится. Но, к сожалению, у меня нет навыков с Башом. Я уже безуспешно пытался сделать это около тысячи раз.
Как то так (но хорошо написано):
PS1="`if [ \$? = 0 ];then echo "prev_err=0"; else prev_err=0; fi\`
...[Some more code in between]...
`if [ \$prev_err = 0 ]
then echo "No error"
else echo "There was an error in the statement."
fi\`"
Некоторые ` (символы обратного хода) находятся в неправильных местах или опущены в предыдущем блоке кода.
2 ответа
Вы, вероятно, лучше делать большую часть этого в PROMPT_COMMAND, который, цитируя руководство Bash "Если установлено, значение выполняется как команда перед выдачей каждого основного приглашения"
Смотрите также этот огромный пример.
Мой это:-
PROMPT_COMMAND='history -a; history -n; printf "\e]1;${PWD}\a"'
который держит мою историю синхронизированной через окна терминала.
Тогда вам, вероятно, следует поместить как можно больше внутри функций bash, чтобы упростить задачу.
Кстати - вы можете найти du -sh .
немного полезнее и проще, чем /bin/ls -lah | /bin/grep -m 1 total
просто чтобы получить использование файла`
Моя подсказка содержит несколько функций, таких как
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$BOLD_FORMAT\] \[$ERROR_FORMAT\] $exit_code \[$RESET_FORMAT\] " ")'
Это работает для вас?