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

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

Я сделал пользовательскую переменную PS1, которая чрезвычайно запутанна. Вот та, которая наиболее близка к полной работоспособности:

PS1="\n[\e[1;31m]\u@\H[\e[35m] \@ [\e[32m] PWD: \w [\e[1;34m]В этой папке находится \$(/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 ]; then echo [\e[32m]^_^ [\e[0m] Сработало - [\e[0m]; else echo [\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ищет условие, которое больше не может быть ложным после выполнения for (eg.) "This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files", поскольку оно истинно, если последний оператор имел чистое завершение.

Как мне заставить это работать, сохраняя при этом вывод в том же положении? Если if переместить до выполнения первой команды, то все будет работать нормально.

Я думал о назначении переменной с этим ifусловием в начале PS1. Тогда другой ifна этой позиции будет судить об альтернативной переменной, которая не изменится. Но, к сожалению, у меня вообще нет навыков работы с Bash. Я уже безуспешно пытался сделать это тысячу раз или около того.

Что-то вроде этого (но хорошо написано):

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\`"

Некоторые символы ` (обратные кавычки) находятся в неправильных местах или пропущены в предыдущем блоке кода.

решение1

Вероятно, вам лучше сделать большую часть этого в 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просто получить информацию об использовании файла.

решение2

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

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

Вас это устраивает?

Связанный контент