Из man-страницы bash
Заключение символов в двойные кавычки сохраняет буквальное значение всех символов в кавычках, за исключением $, `, \ и, когда расширение истории включено,!.
Имея это в виду, как получается, что echo -ne "\n"
производит перевод строки?Разве оболочка не расширит "\ n" до того, как она будет передана echo
?
Я подумал, что это может сработать, потому что echo
встроен, и поэтому оболочка достаточно умна, чтобы делать правильные вещи.Однако даже вызов внешнего /usr/bin/echo -ne "\n"
работает.
Что еще более любопытно, так это то, что независимо от того, что я в двойных или одинарных кавычках \n
, следующие две команды показывают, что bash передает \\n
в качестве аргумента:
$ strace /usr/bin/echo "\n" 2>&1 | head -n1
execve("/usr/bin/echo", ["/usr/bin/echo", "\\n"], [/* 33 vars */]) = 0
$ strace /usr/bin/echo '\n' 2>&1 | head -n1
execve("/usr/bin/echo", ["/usr/bin/echo", "\\n"], [/* 33 vars */]) = 0
Что здесь происходит?