Вопрос почему sh и ./ обеспечивают раздельный вывод для того же скрипта


$ sh emp1.sh
Enter the pattern to be searched: 
$ ./emp1.sh
Enter the pattern to be searched: \c

Содержимое сценария emp1.sh

$ cat emp1.sh
#!/bin/bash
#emp1.sh: interactive version uses read to take input

echo "Enter the pattern to be searched: \c"
read pname
echo "Enter the file to be used: \c"
read flname
echo "searching for the pattern $pname from the file $flname"
grep "$pname" $flname
echo "Selected records are shown above"

Сообщите мне, почему их отличие в первой строке, почему \ c - их во второй строке.

$ sh emp1.sh
Enter the pattern to be searched: 
$ ./emp1.sh
Enter the pattern to be searched: \c

1
2017-11-23 08:28


происхождения


Этот скрипт ошибочен как как sh-script, так и как скрипт bash. Как сценарий sh, printf следует использовать вместо echo, Как сценарий bash, read's -p следует использовать вместо echo, Например. read -ep "Enter file to be used: " flname - geirha


ответы:


На самом деле есть две разные оболочки. Один /bin/bash и другие /bin/dash, А также /bin/sh на самом деле является /bin/dash, Чтобы проверить это, напишите в терминале,

which sh

вы получите результат: /bin/sh

Следующий тип ls -l /bin/sh в терминале, который вернет что-то вроде,

lrwxrwxrwx 1 root root 4 May 16 20:23 /bin/sh -> dash

Это показывает, что sh является мягкой связью /bin/dash, вы можете попробовать дальше which dash,

На самом деле bash является sh с большим количеством функций и улучшенным синтаксисом. Оба они имеют почти одинаковые команды, но они разные.

Что здесь происходит

Когда вы работаете sh emp1.sh то скрипт обрабатывается dash но когда вы запускаете ./emp1.sh из-за линии shebang (#!/bin/bash) поверх скрипта bash оболочка обрабатывает его. Таким образом, вы получаете небольшое разное форматирование на выходе. Иметь ввиду bash имеет некоторый улучшенный синтаксис.


3
2017-11-23 09:49





Выход отличается от того, что вы используете две разные программы.

В первом случае sh emp1.sh вы запускаете программу с именем sh и скажите ему выполнить инструкции в emp1.sh. Эта программа sh, вероятно, является оболочкой bourne (sh), bourne еще раз shell (bash), пытающийся подражать классической оболочке (и, таким образом, реагируя иначе, чем ее собственный режим), тире или даже что-либо еще.

Когда вы используете ./emp1.sh вы пытаетесь выполнить скрипт empt1.sh. Его первая строка содержит shebang и интерпретатор (#!/bin/bash), говоря, что ему нужно использовать bash (и все его функции).

Это означает, что вы используете другую программу / режим, чем в первом случае. И вы получаете разные результаты.

Чтобы проверить это, попробуйте один из следующих двух способов:

  • /bin/bash emp1.sh  (который должен давать тот же результат, что и ./emp1.sh)
  • Или измените первую строку на #!/bin/sh,

-1
2017-11-23 11:37



/bin/sh представляет собой оболочку POSIX в современных UNIX и UNIX-подобных системах. Вы, к счастью, не видите bourne как /bin/sh гораздо больше. В случае Ubuntu тире используется по умолчанию как sh. - geirha