Один перевод строки равен двум переводам строки в bash?

312
Javad

Так что, пока я тестировал программу на Python, над которой я работал, я заметил это echo -e "\n"и в printf "\n"соответствии с ifутверждением в bash.

Даже несмотря на то, что echo -e "\n"печатает две новые строки (по умолчанию добавляется одна), а printf печатает только одну.

if [ "$(echo -e "\n")" == "$(printf "\n")" ] then echo 1 fi 

а также

if [ $(echo -e "\n") -eq $(printf "\n") ] then echo 1 fi 

оба выхода 1 в баш. Я также заметил, что присвоение выходов переменной выводит только одну новую строку для обоих echo -e "\n"и printf "\n",

A=$(echo -e "\n") B=$(printf "\n")  echo $A # outputs a single newline echo $B # also outputs a single newline 

так что я думаю, что echoможет выводить новую строку по-другому с FX. STDERR?

0

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

2
Toni Dietze

Новые строки удаляются подстановкой команд $(). На странице bash написано:

Подстановка команд позволяет выводу команды заменить имя команды. Есть две формы:

$(command) 

или же

`command` 

Bash выполняет расширение, выполняя команду в среде подоболочек и заменяя подстановку команды стандартным выводом команды, удаляя все завершающие символы новой строки . Внедренные новые строки не удаляются, но они могут быть удалены во время разделения слов. Подстановка команд $ (cat file ) может быть заменена эквивалентной, но более быстрой $ (< file ).

@JavadSM Кстати, даже если `$ ()` не удаляет символы новой строки, если она не заключена в кавычки, оболочка будет обрабатывать эти строки как пробелы и игнорировать их. Таким образом, `[$ (echo -e" \ n ") -eq $ (printf" \ n ")]` анализирует до эквивалента `[-eq]`, что верно, потому что "-eq" не является пустая строка `[$ (echo -e" \ n ") -ne $ (printf" \ n ")]` и `[$ (echo -e" \ n ") wibble $ (printf" \ n ")]` даст тот же результат по той же причине. Мораль: используйте двойные кавычки практически во всех расширениях команд и переменных, чтобы избежать разбора. Gordon Davisson 6 лет назад 0

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