Каково различие между 'тестом' и 'test.sh' при выполнении сценариев оболочки?

Я добавил a ./bin/ папка в моем корневом каталоге.

И я поместил два файла в ./bin папка, один только с именем файла и другим является filename.ext.

Имена файлов test и test.sh:

screen-shot-1

Когда я работаю только с именем файла, терминал не делает проявления никакого вывода, но когда я попробовал test.sh, сценарий получает выполнение:

screen-shot-2

Мой Вопрос, могу я запускать скрипт только при помощи имени файла, такого как "тест" на терминале, вместо того, чтобы дать "test.sh".

1
задан 28 October 2017 в 17:52

1 ответ

Как оболочка выполняет команды:

Из руководства удара:

Если имя не является ни функцией оболочки, ни встроенным, и не содержит наклонных черт, удар ищет каждый элемент ПУТИ для каталога, содержащего исполняемый файл тем именем.

Это означает, что функции и окружают встроенные команды, имеют приоритет сначала, и если нет ни одного - это ищет команду в списке каталогов, которые указаны в PATH переменная.

Почему моя 'тестовая' команда не работала?

То, с чем Вы встретились, test команда, которая является встроенной командой, совместимой с исходной Оболочкой Bourne в bash. Эта команда тиха, и используется для простой логики, арифметической оценки и строковой оценки. Это используется в логике и если операторы:

bash-4.3$ test 1 -le 2 && echo "1 is less that or equal to 2"
1 is less that or equal to 2
bash-4.3$ if test 1 -le 2 ; then echo "1 is less than or equal to 2"; fi
1 is less than or equal to 2

Отметьте это test и [ точно то же:

bash-4.3$ [ 1 -le 2 ] && echo "1 is less that or equal to 2"
1 is less that or equal to 2
bash-4.3$ if [ 1 -le 2 ] ; then echo "1 is less than or equal to 2"; fi
1 is less than or equal to 2

Существует также /usr/bin/test который является среди стандартных утилит, и существуйте для мобильности и совместимости. Если было нет test встроенный в Вашей оболочке, это просмотрело бы PATH переменная, и если /usr/bin/ произошедший, чтобы быть перед Вашим ~/bin в списке - это работало бы /usr/bin/test. Вот пример этого:

bash-4.3$ enable -n test
bash-4.3$ PATH="$HOME/bin/:$PATH" test
I am ~/bin/test

Используя enable -n команда мы выключаем встроенное test, и выполненный test временно с измененным PATH такой мой ~/bin является первым в списке. Оболочка смотрит на список и находит мой сценарий оболочки ~/bin/test и выполнил его.

Примечание: не делайте этого! Вышеупомянутый пример для демонстрации только! Это не хороший способ запустить Ваши скрипты и не рекомендуется. Используйте соответствующее именование, никогда не называйте Ваши команды тем же как оболочку созданные-ins или существующие утилиты. Вас предупредили.

Почему test.sh работал?

Что произошло в Вашем test.sh случай - то, что там не встроено или вызванные функции test.sh и поэтому оболочка искала каждый каталог в PATH список, пока это не нашло Ваш test.sh файл и выполнил его. Вот почему это работает.

Это поведение касается расширений файла?

Нет. Это не имеет никакого отношения к расширениям файла, и на самом деле для большинства файлов расширение не важно. Shell заботится о местоположении того, что Вы вводите в командной строке, если это - встроенное или функция или псевдоним, и если файлу, который Вы упоминаете, установили исполняемые полномочия.

Кроме того, это заботится о соответствующем #! строка (который более официально известен как директива интерпретатора), потому что, если Вам записали сценарий оболочки, говорят для оболочки C, но это не имеет соответствующим #! строка наверху, и Вы пытаетесь выполнить его с bash - оболочка попытается выполнить его, но это повредится из-за несовместимого синтаксиса.

В более общем плане Linux и подобные Unix системы главным образом заботятся о магических числах, которые составляют первые несколько байтов в файле, которые определяют тип файла.

3
ответ дан 7 December 2019 в 12:31

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

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