Как в следующем примере, и как в моем недавнем вопросе в bash, куда ушел завершающий символ новой строки? Я хочу знать, "почему" это происходит
x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p
# Output is: 610a62
# The trailing newline from the 'echo' command
# has been "deleted" by Command Substitution
Я предполагаю, что должна быть какая-то очень существенная причина для действия оболочки, а именно Подстановка команд, для фактического удаления некоторых данных из выходных данных команды, которые она заменяет ...
но я не могу разобраться с этим, как кажется, антитеза того, что он должен делать .. т.е. передать вывод команды обратно в процесс сценария ... Удержание одного символа кажется мне странным, но я полагаю, что для этого есть разумная причина ... Я очень хочу выяснить, что это за причина .. ,
Ответы:
Поскольку оболочка изначально не предназначалась для полноценного языка программирования.
Довольно сложно удалить трейлинг
\n
из некоторых выводов команды. Однако для целей отображения почти все команды заканчивают вывод\n
, поэтому… должен быть простой способ удалить его, если вы хотите использовать его в другой команде. Автоматическое удаление со$()
строительством было выбрано решение.Итак, возможно, вы примете этот вопрос в качестве ответа:
Можете ли вы найти простой способ удалить трейлинг,
\n
если это не было сделано автоматически в следующей команде?Обратите внимание, что кавычки необходимы для предотвращения разбивки двойных пробелов, которые могут появляться в отформатированных датах.
источник
shopt
возможность изменить описанное вами поведение по умолчанию, то я был бы рад снова ... Мне трудно думать, что Bash / Linux / Unix загрязнит такую важную функцию, как "захват stdout" только потому,date
что не имеет a с / без опции '\ n' ... Очевидным исправлением будет то, что bash (или другая оболочка) имеетshopt
для этого ... Знаете ли вы что-нибудь? ... а есть ли у вас ссылки, которые говорят о причинах и причинах этого вопроса? ... и почему нетdate
опции \ n .. Должно быть!$()
альтернативного синтаксиса.{ echo -n "The current date is "; var="$(date; echo -e x)"; var="${var%x}"; echo -n "$var"; echo ", have a good day!"; }
date
сработало бы, но я просто использовалdate
в качестве примера любую команду ..Это часть стандарта :
Конечно, стандарт, вероятно, написан таким образом, потому что вот как
ksh
он это сделал или что-то в этом роде, но это стандарт и документированное поведение. Если вам это не нравится, используйте Perl или что-то еще, что позволит вам сохранить последние переводы строки.источник
Ну, это имеет смысл для меня. Новая строка находится только на первом месте в обычном выводе команды, поэтому приглашение появляется после завершения команды в новой строке. В большинстве случаев новая строка не является частью исходного вывода, она помогает привести в порядок экран. Когда вы анализируете выходные данные команды, перевод строки в конце обычно вызывает проблемы. Почему
wc
команда выводит 2 строки текста? О, это не так, он выводит один, за которым следует новая строка. Когда вы анализируете,wc
вы не хотите беспокоиться о том, что есть 2 строки вывода - на самом деле их нет, есть только одна.источник
\n
в исходномstdout
потоке удаляется подстановка команд. то есть. В моих исходных данных (очень важных данных) удаляются завершающие символы новой строки, даже когда данные заключены в "кавычки". Я достаточно хорошо понимаю, как и почему работает Word Splitting, но я совершенно не понимаю, почему подстановка команд удаляет только новые строки и только конечные .Я столкнулся с той же проблемой, и нашел ниже пример. Кажется, цитирование помогло ситуации, по крайней мере, для меня:
http://tldp.org/LDP/abs/html/commandsub.html .
источник
$str
, содержащая строку"a b c"
. Если вы пройдете$str
кecho
без кавычек (echo $str
),echo
будет получатьa
,b
иc
как три отдельные аргументы. Ваша оболочка не заботится о пробелах между аргументами.echo
затем напечатает эти аргументы с пробелами, разделяющими каждый, так что вы получите"a b c"
. Если вы передадите переменную вecho
кавычки вокруг нее (echo "$str"
), оболочка увидит в ней один аргумент иecho
получит его как таковой, поэтому пробел не будет свернут. То же относится и к переводу строки.-n
флаг не пройден ,echo
к его выходу добавляется завершающий символ новой строки, поэтому оба эха в вашем примере содержат завершающие символы новой строки. Однако, если вы попробуетеecho -n $dir_listing
илиecho -n "$dir_listing"
, вы увидите, что завершающий символ новой строки не выводится с кавычками или без них$dir_listing
, что указывает на проблему с подстановкой команд.почему
echo "hello "
(без кавычек) сожрать пространство? значение символов IFS рассматривается оболочкой как разделители, поэтому завершающие (которые ничего не разделяют) удаляются. Подстановка commend - это просто выполнение комментариев в под-оболочке, поэтому она следует той же логике.источник
x="hello "
иx="hello "
потеряют все свои завершающие пробелы, если они отображаются черезecho $x
... Однако потеряется только самая последняя новая строка Командного Подстановки.IFS
не имеет никакого отношения к удалению строк в конце подстановок команд.