Если bash не сохраняет обратный слеш в двойных кавычках, то почему работает echo -e "\ n"? - PullRequest
4 голосов
/ 26 декабря 2011

Из 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

Что здесь происходит?

1 Ответ

4 голосов
/ 26 декабря 2011

Продолжение чтения:

Обратная косая черта сохраняет свое особое значение только тогда, когда за ней следует один из следующих символов: $, &#96;, ", \ или <newline>.

Поскольку за ним следует только буква, он не сохраняет своего особого значения и передается программе буквально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...