Почему "\\\\" равно "\\" в zsh? - PullRequest
1 голос
/ 02 июня 2019

Таким образом, чтобы записать обратную косую черту в stdout, вы делаете

zsh$ echo \\
\

Вы могли бы подумать, что для вывода 2 обратной косой черты, вам нужно выполнить следующее:

zsh$ echo \\\\
\

Неправильно , вам нужно 6 или 8:

zsh$ echo \\\\\\
\\
zsh$ echo \\\\\\\\
\\

Зачем мне нужно 8 обратных слешей?

Поведения в различных оболочках:

ksh$ echo \\\\
\\
zsh$ echo \\\\
\
bash$ echo \\\\
\\
sh$ echo \\\\
\
csh$ echo \\\\
\\

Backslashes

Ответы [ 2 ]

4 голосов
/ 02 июня 2019

Вы, вероятно, привыкли к встроенному bash echo, который не выполняет расширение escape-последовательностей. POSIX echo, однако делает . zsh следует спецификации POSIX, поэтому, когда вы пишете echo \\\\\\, вот что происходит.

  1. Удаление цитаты уменьшает \\\\\\ до \\\; каждый сбежавший \ становится буквальным \.
  2. echo принимает три \, которые он получает, и заменяет первое \\ на \. Остальные \ ничего не предшествуют, поэтому трактуются буквально.
  3. Окончательный результат - это вывод двух \.

С echo \\\\\\\\ вот что происходит.

  1. Как и прежде, \\\\\\\\ становится \\\\, потому что каждая пара обратных слэшей становится одиночной \ после удаления цитаты.
  2. echo принимает 4 обратных слеша и заменяет первый \\ на \, а second \\ на \, так как на этот раз он получил две подходящие пары.
  3. Окончательный результат снова два \.

bash, вероятно, унаследовал его не-POSIX-соответствие от ksh, sh по определению является POSIX-совместимой оболочкой, и лучше не думать о том, что делает csh.

0 голосов
/ 02 июня 2019

Не только zsh, это поведение по умолчанию в терминале, обратная косая черта (\) - это специальный символ, используемый, чтобы сообщить bash-скрипту, что вы хотите использовать другие параметры / тексты в новой строке, поэтому, чтобы избежать новой строки, вам нужно добавить еще одну обратную косую черту в экранирующий специальный символ, поскольку для экранирующего спецсимвола также используется обратный слеш

...