echo -e экранирование обратной косой черты не соблюдается в sh

У меня есть сценарий оболочки, который я хочу запустить на разных серверах Linux. Когда я запускаю команду echo с параметром -e и escape-символами в строке, она не выполняется должным образом в оболочке sh в Ubuntu 12.04 или Ubuntu 11.04. Два используемых нами сервера, на которых я хотел бы, чтобы скрипт работал, работают под управлением CentOS 5.3 и Ubuntu 12.04. Когда я запускаю следующую команду в bash на двух серверах, создается ожидаемый результат:

$ echo -e "line1\nline2"
line1
line2

Когда я запускаю ту же команду в sh на машине с CentOS, также создается правильный вывод. Но когда я запускаю команду в sh на Ubuntu 12.04 или 11.04, получается следующий вывод:

$ echo -e "line1\nline2"
-e line1
line2

Интересно, если я запущу ниже в sh на Ubuntu, он автоматически интерпретирует escape-символы.

$ echo "line1\nline2"
line1
line2

Сценарий должен работать в оболочке sh и должен быть переносимым на разные машины. Любые решения. Я также был бы очень признателен за ссылку на некоторые документы, объясняющие, почему и как это происходит.


person Marwan Alsabbagh    schedule 22.10.2012    source источник


Ответы (2)


Оболочка sh в Ubuntu — это dash. Его встроенное эхо не имеет опции -e (и, следовательно, оно просто повторяет ее, как вы видели), или, скорее, у него нет способа отключить поведение выхода.

Вместо этого используйте /bin/echo.

Чтобы проверить, какую оболочку вы используете, попробуйте echo $SHELL

$ echo $SHELL
/bin/bash
person rici    schedule 22.10.2012
comment
@MarwanAlsabbagh /bin/echo не лучшая альтернатива. Если вы действительно хотите использовать /bin/sh, используйте printf, в противном случае используйте другую оболочку. - person ormaaj; 22.10.2012
comment
Удивительно: POSIX 7 указывает, что эффекты экранирования обратной косой черты не определены: строка, которая должна быть записана в стандартный вывод. Если первым операндом является -n или любой из операндов содержит символ ‹обратной косой черты›, результаты определяются реализацией. Я полагался на это так много раз! источник - person Ciro Santilli 新疆再教育营六四事件ۍ 28.07.2013

echo безнадежно несовместимо между реализациями; если вам нужно последовательное поведение для нетривиальных приложений (например, управляющих последовательностей), используйте вместо этого printf (и не забудьте явно добавить последний \n):

$ printf "line1\nline2\n"
line1
line2
person Gordon Davisson    schedule 22.10.2012