Как вставить bash-скрипты в переменную PS1

2233
SOMN

Я сделал собственную переменную 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 ': :: 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

2 ответа на вопрос

3
Tony Williams

Вы, вероятно, лучше делать большую часть этого в PROMPT_COMMAND, который, цитируя руководство Bash «Если установлено, значение выполняется как команда перед выдачей каждого основного приглашения»

Смотрите также этот огромный пример .

Мой это: -

PROMPT_COMMAND='history -a; history -n; printf "\e]1;$\a"' 

который держит мою историю синхронизированной через окна терминала.

Тогда вам, вероятно, следует поместить как можно больше в bash-функции, чтобы упростить задачу.

Кстати, вы можете найти, du -sh .что это немного полезнее и проще, чем /bin/ls -lah | /bin/grep -m 1 totalпросто использовать файл`

Заметьте, я любил все, что видел (особенно связанный огромный пример), но последняя часть звучит так, как будто это может привести к серьезным задержкам. Например, синхронизация `du -sh .` в $ HOME заняла _real 0m34.018s_ и имела 4 _du: ./Library / ...: в доступе отказано 'диагностика_. Сроки последнего случая, _real 0m0.006s_ - едва заметны. Billy McCloskey 10 лет назад 0
2
l0b0

Моя подсказка содержит несколько функций, таких как

PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$BOLD_FORMAT\] \[$ERROR_FORMAT\] $exit_code \[$RESET_FORMAT\] " ")' 

Это работает для вас?

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