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

Я настраиваю свой 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 $>" 

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

2 Solutions collect form web for “Элегантный способ предотвратить замену команд от удаления конечной строки новой строки”

Окончательные новые строки удаляются из подстановок команд. Даже 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 $ 
  • Проблемы с использованием возвышенного текста для редактирования командной строки в режиме ВП
  • Zsh: автоматическое изменение выполняемой команды
  • Что такое sourcing мой сценарий оболочки?
  • В zsh, какая разница между &! и & |
  • повторное использование последнего вывода команды с заданным индексом / строкой-номером
  • Ctrl + левая / правая стрелка
  • Сравнение строк в отдельных скобках в zsh
  • Что нужно / не следует входить .zshenv, .zshrc, .zlogin, .zprofile, .zlogout?
  • zsh автозавершение некоторых частей каталога
  • Странное поведение при поиске .zshrc
  • Как получить полное завершение в диалоговом окне запуска приложения?
  • Linux и Unix - лучшая ОС в мире.