Вопрос: Как вставить скрипты 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: :: g ') files [\ e [1; 33m] Всего \ $ (/ bin / ls -lah | / bin / grep -m 1 total | / bin / sed / total // ') b \ n`if [\ $? = 0], затем 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 ищет условие, которое больше не может быть ложным после запуска (например.) "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
2018-01-18 08:48


Источник




Ответы:


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

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

Шахта: -

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

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

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

BTW - вы можете найти du -sh . является немного более полезным и легким, чем /bin/ls -lah | /bin/grep -m 1 total просто чтобы получить доступ к файлу`


3
2018-01-18 09:24



Мне понравилось все, что я видел, заметьте (особенно связанный огромный пример), но эта последняя часть звучит так, как будто это может привести к серьезным задержкам. Например, время a du -sh . в $ HOME реальный 0m34.018s, и имел 4 du: ./Library / ...: разрешение отказа от диагностики, Сроки последнего случая, реальный 0m0.006s - вряд ли заметно. - Billy McCloskey


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

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

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


2
2018-01-18 09:43