$ 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
из-за линии шебанга (#!/bin/bash
) поверх скрипта bash
оболочка обрабатывает его. Таким образом, вы получите небольшое различное форматирование в выводе. Имейте в виду, bash
имеет улучшенный синтаксис.
Вывод отличается, потому что вы используете две разные программы.
В первом случае sh emp1.sh
вы запускаете программу с именем sh
и говорите ей выполнить инструкции в emp1.sh. Эта программа sh, вероятно, представляет собой оболочку bourne (sh), оболочку bourne again (bash), пытающуюся эмулировать классическую оболочку (и, таким образом, реагирующую не так, как в ее основном режиме), dash или даже что-то еще.
Когда вы используете ./emp1.sh
, вы пытаетесь выполнить скрипт empt1.sh. Его первая строка содержит shebang и интерпретатор (#!/bin/bash
), говорящий ему, что он должен использовать bash (и все его функции).
Это означает, что вы используете другую программу / режим, чем в первом случае. И вы получите другой результат.
Чтобы убедиться в этом, попробуйте один из следующих двух:
/bin/bash emp1.sh
(который должен выдавать тот же результат, что и ./emp1.sh)#!/bin/sh
.