В моем Linux-окне echo $SHELL приводит к /bin/csh . Поэтому я предполагаю, что моей оболочкой по умолчанию является c-shell. Я пытаюсь понять поведение сценария оболочки.
сценарий 1 - сценарий содержит -

echo $1 $2 $3
echo $*
echo $argv[1] $argv[2]
$argv[3]
echo $argv[*]
echo $#argv

выход -

arg1 arg2 arg3
arg1 arg2 arg3 arg4
[1] [2]
./test.sh: line 4: [3]: command not found
[*]
4argv
  • Очевидно, что c-shell не может выполнить последние 4 строки в скрипте, которые должны быть выполнены csh.

Однако - когда я добавлю строку Шебанга #!/bin/csh в верхней части скрипта, он выводит все выходные данные правильно.

Вопрос - Почему csh неправильно выполняет последние 4 строки в первом сценарии и почему я должен явно включить строку shebang?

1 ответ1

1

Когда файл начинается с #!/bin/csh , вы явно указываете ядру запустить скрипт с этой программой. Но если нет #! в начале вашего файла происходит сбой выполнения - сбой системного вызова exec() - и ваша оболочка пытается запустить скрипт, используя еще более старый метод, передавая файл непосредственно в /bin/sh .

Оболочка Bourne, sh , реализовала такое поведение раньше, чем #! и поэтому сценарии, написанные таким образом, ожидают запуска под sh или, по крайней мере, в совместимой оболочке. csh далеко не совместим, поэтому он запускает такие скрипты под sh. Ваш $ SHELL не имеет значения.

tcsh:

Поскольку многие системы используют либо стандартные версии 6, либо версии 7, чьи сценарии оболочки не совместимы с этой оболочкой, оболочка использует такую «стандартную» оболочку для выполнения сценария, первый символ которого не является символом «#», т.е. это не начинается с комментария.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .