Следующий код лучше всего описывает ситуацию. Почему последняя строка не выводит завершающий символ новой строки? Вывод каждой строки показан в комментарии. Я использую GNU Bash, версия 4.1.5
echo -n $'a\nb\n' | xxd -p # 610a620a
x=$'a\nb\n' ; echo -n "$x" | xxd -p # 610a620a
echo -ne "a\nb\n" | xxd -p # 610a620a
x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p # 610a62
tmp=$(somecommand; echo a); tmp=${tmp%a}
tmp=$(somecommand; echo a)
... Это, безусловно, послужило основанием ... Пока я не увидел пример, моя склонность все еще была бы в использованииecho -n a
... но, конечно же, нет необходимости-n
, потому что команда Замена удалит введенный трейлинг символ новой строки в любом случае! ... спасибо ...Ответы:
Функция подстановки команд
$()
(и ее двоюродный брат с обратной косой чертой) специально удаляет завершающие символы новой строки. Это документированное поведение , и вы всегда должны знать об этом при использовании конструкции.Новые строки внутри текстового тела не удаляются оператором подстановки, но они также могут быть удалены при делении слов в оболочке, поэтому то, как это получится, зависит от того, использовали ли вы кавычки или нет. Обратите внимание на разницу между этими двумя способами:
Во втором примере выходные данные не были заключены в кавычки, а символ новой строки интерпретировался как разделение слов, в результате чего он отображался в выходных данных как пробел!
источник
При использовании подстановки команд оболочка выполняет команды в подоболочке, возвращая их стандартный вывод. в этом процессе символы IFS теряют свою значимость (если они не заключены в кавычки), поскольку commend возвращает простые разделенные слова, поэтому завершающие слова удаляются. Например:
и более практично,
pwd
будет работать, даже если в вашем имени каталога есть новая строка между ними, но$(pwd)
не будет.Обычный обходной путь заключается в добавлении чего-либо в конце вашей команды и последующем ее удалении.
источник
echo "$(echo -e '\n')" | wc
, который выводит1 0 1
, по сравнению с2 0 2
$(pwd)
и"$(pwd)"
, см ответа Калеба.