Наличие простых команд эха:
echo "\n"
а также
echo "\\n"
оба результата дают одинаковый результат
\n
Может кто-нибудь объяснить мне подробно, как bash обрабатывает такие команды (char за char) и почему результат одинаков в обоих случаях?
Короткий ответ: \ не всегда является особенным для bash или echo . Двойные кавычки сохраняют буквальное строковое значение всего внутри, кроме $ , ` , \ , а иногда и ! , Вне двойных кавычек, \ всегда особенный для bash: он сохраняет буквальное строковое значение следующего символа. Внутри кавычек обратная косая черта \ является специальной, если за ней следует один из пяти символов: $ , ` , " , \ или символ новой строки. В первых четырех случаях он сохраняет буквальное строковое значение следующего символа. Для bash версии echo \ никогда не бывает особенным, если не указан флаг -e .
Итак, в ваших двух случаях, что происходит:
echo "\n"
в этом случае \ не сопровождается ни одним из пяти упомянутых символов, и поэтому обрабатывается как его буквальное строковое значение.
echo "\\n"
в этом случае за первым \ следует второй \ . Первое экранирует второе, поэтому оно интерпретируется как его буквальное строковое значение. Это бесполезно, так как в любом случае оно будет интерпретироваться как его буквальное строковое значение, но это может быть полезно, если вы хотите напечатать одну обратную косую черту в конце строки, как в:
echo "This is a single backslash:\\"
поскольку в противном случае обратная косая черта будет интерпретироваться оболочкой как выходящая " .
Всю эту информацию можно почерпнуть из части справочной страницы bash о двойных кавычках, которую можно найти здесь.
Одиночный \ сохраняет буквальное строковое значение символа сразу после него.
Итак, в этом случае:
echo "\\n"
Первый \ сохраняет строковый литерал \ который находится перед "n" . Если бы вы набрали следующее ...
echo "\"
... вам нужно завершить команду, так как интерпретатор не увидит "\" как строковый литерал, а вместо этого будет ожидать ввода пользователя, чтобы избежать "следующего" символа.
Однако, если символ \ включен в одинарные кавычки, тогда не ожидается никакого escape-символа, так как одиночные кавычки сами по себе не сохраняют литеральные символы, которые они заключают.
Так, например: echo '\'
Это напечатало бы обратную косую черту как строковый литерал, а не как escape-символ, так что интерпретатор не будет ждать, пока пользователь включит символ.
Эта информация и многое другое включено в справочную страницу bash.