Поясніть, будь ласка, поведінку оболонки (повинна бути csh)


0

У моєму вікні 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.

Однак - коли я додаю рядок shebang #!/bin/cshу верхній частині сценарію, він правильно друкує всі результати.

Питання - Чому csh не виконує останні 4 рядки правильно в першому сценарії, і чому я явно повинен включати рядок shebang?

Відповіді:


1

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

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

tcsh :

Оскільки багато систем використовують або стандартну оболонку версії 6, або версії 7, сценарії оболонки якої не сумісні з цією оболонкою, оболонка використовує таку «стандартну» оболонку для виконання сценарію, перший символ якого не є «#», тобто це не починається з коментаря.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.