Intereting Posts
Как указать символы, используя шестнадцатеричные коды в `grep`? Замените длинную строку командой sed: слишком длинная ошибка списка аргументов Папки мониторинга, установленные через SSHFS Pipe Fail (141) при выходе трубопровода в тройник – почему? gcc компиляция завершена с помощью «фатальной ошибки: строка: нет такого файла или каталога #include <string>" Отсутствуют значки управления в Totem (видео Gnome) человек дает ошибку о локали Создать скрипт bash для скрипта cmd Команда «cp p2 & 2 &» заставляет Konsole исчезать, это ошибка? Могу ли я изменить тип терминала, который используется для входа через SSH? Как удалить часть пути в интерактивной оболочке? Список открытых томов LUKS dm-crypt Что такое файл ключа kerberos keytab, используемый для аутентификации Kerberos в UNIX / AD? ssh user @ IP sh <команда> пропущенные переменные среды В чем разница между отключением питания и остановкой?

Элегантный способ предотвратить замену команд от удаления конечной строки новой строки

Я настраиваю свой zsh PROMPT и вызывая функцию, которая может или не может echo строка на основе состояния переменной среды:

 function my_info { [[ -n "$ENV_VAR"]] && echo "Some useful information\n" } local my_info='$(my_info)' PROMPT="${my_info}My awesome prompt $>" 

Я хотел бы, чтобы информация заканчивалась на задней новой строке, так что, если она установлена, она появляется в отдельной строке:

 Some useful information My awesome prompt $> 

Однако, если он не установлен, я хочу, чтобы приглашение было в одной строке, избегая пустой строки, вызванной безусловной новой строкой в ​​моей подсказке:

 PROMPT="${my_info} # <= Don't want that :) My awesome prompt $>" 

В настоящее время я работаю над $(command substitution) удаляя мою новую строку, суффиксом ее с помощью непечатаемого символа, поэтому новая строка больше не заканчивается:

 [[ -n "$ENV_VAR"]] && echo "Some useful information\n\r" 

Это, очевидно, взлом. Есть ли чистый способ вернуть строку, которая заканчивается на новой строке?

Редактирование: я понимаю, что вызывает потерю конечной новой строки и почему это происходит , но в этом вопросе я хотел бы точно знать, как предотвратить это поведение (и я не думаю, что это обходное решение применяется в моем случае, так как я ищет «условную» новую строку).

Редактирование: я исправляюсь: обходное решение, на которое указывает ссылка, может быть довольно приятным решением (поскольку префикс строк в сравнениях является общим и несколько похожим шаблоном), за исключением того, что я не могу заставить его работать правильно:

 echo "Some useful information\n"x [...] PROMPT="${my_info%x}My awesome prompt $>" 

не снимает для меня хвост x .

Изменить: отрегулировав предлагаемый обходной путь для странности, которая является быстрым расширением, это сработало для меня:

 function my_info { [[ -n "$ENV_VAR"]] && echo "Some useful information\n"x } local my_info='${$(my_info)%x}' PROMPT="$my_info My awesome prompt $>" 

Вы являетесь судьей, если это лучшее решение, чем оригинальное. Я думаю, это немного более явный, но он также чувствует себя немного менее читаемым.

Окончательные новые строки удаляются из подстановок команд. Даже zsh не дает возможности избежать этого. Поэтому, если вы хотите сохранить окончательные новые строки, вам нужно устраивать их, чтобы они не были окончательными новостями.

Самый простой способ сделать это – напечатать дополнительный символ (кроме новой строки) после данных, которые вы хотите получить точно, и удалить этот окончательный дополнительный символ из результата подстановки команды. Вы можете по желанию поставить новую строку после этого дополнительного символа, она будет удалена в любом случае.

В zsh вы можете комбинировать подстановку команд с манипуляцией строкой, чтобы удалить дополнительный символ.

 my_info='${$(my_info; echo .)%.}' PROMPT="${my_info}My awesome prompt $>" 

В своем сценарии позаботьтесь о том, чтобы my_info не был результатом команды, это фрагмент оболочки, чтобы получить результат, который будет оцениваться при расширении приглашения. PROMPT=${my_info%x}… не работает, потому что он пытается удалить конечный x из значения переменной my_info , но заканчивается ) .

В других оболочках это нужно сделать в два этапа:

 output=$(my_info; echo .) output=${output%.} 

В bash вы не сможете вызвать my_info непосредственно из PS1 ; вместо этого вам нужно будет называть это из PROMPT_COMMAND .

 PROMPT_COMMAND='my_info=$(my_info; echo .)' PS1='${my_info%.}…' 

Вы можете заставить свою функцию выводить escape-коды, чтобы при ее расширении она превращалась в новую строку.

 $ function my_info { > [[ -n "$ENV_VAR"]] && echo 'Some useful information\\n' >} $ echo $(my_info) Some useful information $