$ 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
На самом деле есть две разные оболочки. Один /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
имеет некоторый улучшенный синтаксис.
Выход отличается от того, что вы используете две разные программы.
В первом случае 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
,