echo -n отлично работает при выполнении скрипта с bash, но не с sh

Почему sh UsersInput.sh дает другой результат по сравнению с bash UsersInput.sh?

Мой скрипт ниже:

#!/bin/bash
echo -n "Enter: ";
read usersinput;
echo "You entered, \"$usersinput\""; 

баш

localhost:Bash henry$ bash UsersInput.sh 
Enter: input
You entered, "input"

ш

localhost:Bash henry$ sh UsersInput.sh
-n Enter: 
input
You entered, "input"

Почему -n ведет себя правильно с первым, но не со вторым? В чем причина этого и есть ли обходной путь?


person Dev    schedule 25.07.2013    source источник
comment
какая оболочка у тебя sh? На что указывает /bin/sh? Для максимальной переносимости используйте printf без новой строки: printf "Enter: "   -  person glenn jackman    schedule 25.07.2013
comment
@glennjackman Я начну использовать это. Спасибо!   -  person Dev    schedule 25.07.2013


Ответы (2)


С 1_:

Некоторые оболочки могут предоставлять встроенную команду эха, аналогичную этой утилите или идентичную ей. В частности, встроенная функция echo в sh(1) не принимает параметр -n. Обратитесь к встроенной(1) странице руководства.

В bash, оболочке Bourne-again, echo принимает параметр -n, тогда как в sh, оболочке Bourne, echo нет, поэтому он просто повторяет все, что вы написали, включая -n.

person Amory    schedule 25.07.2013
comment
Спасибо за информацию. Я начну использовать printf, как предложил Гленн. - person Dev; 25.07.2013
comment
/bin/sh не является оболочкой Bourne в OS X. Это POSIX-совместимая версия bash. Бинарные файлы /bin/sh и /bin/bash почти идентичны, но большинство различий (включая поведение echo) зависят от имени, с которым вызывается оболочка. - person Lri; 25.07.2013

/bin/sh — это версия bash (не оболочка Bourne) для OS X. В ней включен режим POSIX и несколько других изменений. Одним из них является то, что опция оболочки xpg_echo включена по умолчанию, поэтому встроенное эхо соответствует POSIX.

http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo. HTML:

Реализации не должны поддерживать какие-либо параметры

http://www.gnu.org/software/bash/manual/bash.html#Bash-POSIX-Mode:

44. Когда опция xpg_echo включена, Bash не пытается интерпретировать какие-либо аргументы для эха как опции. Каждый аргумент отображается после преобразования escape-символов.

[...]

Как отмечалось выше, Bash требует, чтобы опция xpg_echo была включена, чтобы встроенная команда echo была полностью совместима.

Вы можете отключить xpg_echo, использовать /bin/echo или, что предпочтительнее, просто использовать printf:

sh -c 'shopt -u xpg_echo; echo -n aa'
sh -c '/bin/echo -n aa'
sh -c 'printf %s aa'
person Lri    schedule 25.07.2013