Какова разница между использованием
echo -e "Hello\nWorld"
и
echo $"Hello\nWorld"
разве они оба не выводят:
Hello
World
command-line
bash
отметка
источник
источник
Hello\nWorld
. Вам нужен-e
переключатель для интерпретации escape-символов.echo $'Hello\nWorld'
, которые будут напечатаны в двух строках под bash.Ответы:
echo -e
иecho $'...'
оба похожи в том, что они поддерживают следующие escape-последовательности:У них есть различия. В дополнение к вышесказанному,
echo -e
поддерживает:Напротив,
$'....'
поддерживает:Заметьте, что между ними
\c
расширения несовместимы:Для
echo -e
выше,\c
подавляет дальнейший вывод, тем самым игнорируяIstop
. Напротив, для$'...'
,\cI
интерпретируется как вкладка.Визуально-подобная форма:
$"..."
В отличие от
$'...'
, функция$"..."
совершенно иная. Это приведет к переводу содержащейся строки в соответствии с текущей локалью.echo -e
спорыecho -e
не всегда поддерживается оболочками, и многие считают эту-e
опцию ошибкой проекта. Заметим:Как вы можете видеть, если то, что вы печатаете,
echo
начинается с тире, результаты могут быть неожиданными. Если вы не уверены, что первая строка, с которой вы будете печататьecho
, не начинается с тире, вам, вероятно, лучше использоватьprintf
.По этим причинам стандарт POSIX заключает :
Чет Рами, который поддерживал в
bash
течение прошлых 22 лет, соглашается :источник
printf
а неecho
*
) на самом деле не является специфическойecho
. Это происходит с любой командой, которая распознает короткие или длинные опции (записанные традиционным способом) и принимает операнды имени файла, включаяls
. Возможно, ситуация немного хуже,echo
поскольку (как упоминает ваш источник)echo
обычно не принимает--
указание окончания опций, в то время как можно писать такие команды, какls -- *l
. (И действительно, обычно следует писать команды таким образом, когда используются глобусы, начинающиеся с*
или-
, особенно в сценариях.)\n
последовательности символов, так что на самом деле это не имеет значения , если я используюecho -e '...'
,echo $'...'
илиecho $"..."