sh
отличается от bash
и ведет себя иначе.
Думаю, что sh
на самом деле dash
.
Кстати, :эта команда ведет себя по-разному, если вы проверяете разные оболочки.
bosh
, dash
, mksh
, zsh
, а также ksh
в Solaris печатают одну обратную косую черту
bash
и ksh
в Linux печатают две обратные косые черты.
Глядя на вывод $shell -x, я считаю, что один обратный слеш является правильным выводом.
Я понятия не имею, почему ksh
ведет себя таким образом в Linux. Возможно, он пытается имитировать bash
поведение.
Для bash
поведение можно объяснить :bash имеет не -POSIX echo
, который не интерпретирует обратную косую черту, как того требует POSIX.
POSIX допускает поведение bash
только на небольших встроенных системах, а в остальном POSIX требует реализации так называемых расширений XSI
. Для echo
требуется полностью следовать поведению echo
, реализованному в 1982 году компанией AT&T для SYSv.
Важное замечание:
Если у вас есть скрипт, начинающийся с
#!/bin/bash
и это исполняемый бит (x
, установленный chmod
), и если вы вызываете
ш мой скрипт
этот сценарий по-прежнему выполняется /bin/sh
, который обычно dash
в Linux. Поэтому будьте осторожны с тем, как вы запускаете свой код.
Есть способ избежать вашей проблемы. Измените свой сценарий, чтобы использовать:
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
printf '%s\n' $ch
Таким образом, вы избегаете проблем с echo
, которые появились в 1989 году с bash
.printf
по-прежнему не решает всех проблем, так как существует много ошибочных реализаций, но обычные проблемы, возникающие из-за обратной косой черты в аргументах, не затрагиваются printf
.