почему 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
задан 9 January 2014 в 01:26

2 ответа

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

0
ответ дан 9 January 2014 в 01:26
  • 1
    ВЫ - FREAKIN' HERO!!! Это работает отлично! Спасибо так, таким образом, так! Теперь я могу наконец спать ночью;) – Maud Kon 23 May 2015 в 15:38

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

В первом случае 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.
0
ответ дан 9 January 2014 в 01:26

Другие вопросы по тегам:

Похожие вопросы: