Эхо-выходы -e в сценариях bash. Как я могу это предотвратить?
Я прочитал страницы man на эхо, и он говорит мне, что параметр -e позволит экранированному символу, например экранированному n для новой строки, иметь особое значение. Когда я набираю команду
$ echo -e 'foo\nbar'
в интерактивную оболочку bash, я получаю ожидаемый результат:
foo
bar
Но когда я использую эту же команду (я пробовал этот символ команды для символа в качестве тестового примера), я получаю следующий вывод:
-e foo
bar
Как будто echo интерпретирует -e как параметр (потому что новая строка все еще отображается), но также интерпретирует -e как строку для эха. Что здесь происходит? Как я могу предотвратить появление -e?
Ответы
Ответ 1
Вам нужно использовать #!/bin/bash
как первую строку в script. Если вы этого не сделаете или используете #!/bin/sh
, script будет запущен оболочкой Bourne, а его echo
не распознает параметр -e
. В целом рекомендуется, чтобы все новые скрипты использовали printf
вместо echo
, если важна переносимость.
В Ubuntu sh
предоставляется символическая ссылка на /bin/dash
.
Ответ 2
Различные реализации echo
ведут себя по-разному. Некоторые не принимают опций (т.е. Будут просто эхо -e
, как вы описали) и автоматически интерпретируете escape-последовательности в своих параметрах. Некоторые принимают флаги и не интерпретируют escape файлы, если не указан флаг -e
. Некоторые принимают флаги и интерпретируют разные escape-последовательности в зависимости от того, прошел ли флаг -e
. Некоторые из вас заставят вас вырвать волосы, если вы попытаетесь заставить их вести себя предсказуемым образом... о, подождите, что все они.
То, что вы, вероятно, видите здесь, - это разница между версией echo
, встроенной в bash
vs /bin/echo
, или, возможно, против какой-либо другой встроенной оболочки. Это немного меня, когда Mac OS X v10.5 поставляется с bash встроенным echo
, который повторял флаги, в отличие от ожидаемых моих сценариев...
В любом случае, есть решение: вместо этого используйте printf
. Он всегда интерпретирует escape-последовательности в своем первом аргументе (строка формата). Проблемы состоят в том, что он автоматически не добавляет новую строку (поэтому вы должны помнить это явно), а также интерпретирует последовательности %
в своем первом аргументе (это, в конце концов, строка формата). Как правило, вы хотите поместить все форматирование в строку формата, а затем поместить переменные строки в остальные аргументы, чтобы вы могли контролировать, как они интерпретируются с помощью формата %
, который вы используете для интерполяции в вывод. Некоторые примеры:
printf "foo\nbar\n" # this does what you're trying to do in the example
printf "%s\n" "$var" # behaves like 'echo "$var"', except escapes will never be interpreted
printf "%b\n" "$var" # behaves like 'echo "$var"', except escapes will always be interpreted
printf "%b\n" "foo\nbar" # also does your example
Ответ 3
Использование
alias echo/usr/bin/echo
чтобы заставить "эхо" вызывать эхо ядра Coreutils, которое интерпретирует параметр "-e".
Ответ 4
Попробуйте следующее:
import subprocess
def bash_command(cmd):
subprocess.Popen(['/bin/bash', '-c', cmd])
code="abcde"
// you can use echo options such as -e
bash_command('echo -e "'+code+'"')
Источник: http://www.saltycrane.com/blog/2011/04/how-use-bash-shell-python-subprocess-instead-binsh/