Почему некоторые системы будут запускать .sh
файл, просто указав имя файла без расширения, а другие требуют имени плюс расширение? В моем случае я пытаюсь написать серию команд, следуя этим инструкциям .
Я сейчас указываю расширение, но .sh
предпочтение отдается запуску команд без него .
command-line
scripts
Филип Киркбрайд
источник
источник
.sh
в качестве расширения во многих случаях считается плохой практикой: это противоречит тому, как называются другие команды (вы не запускаетеls.elf
), оно часто вводит в заблуждение (если выfoo.sh
начинаете с#!/bin/bash
, то при запускеsh foo.sh
он запускается с другим интерпретатором, чем он создан для ), и если вы переписываетеfoo.sh
его в программу Python, использование этого расширения означает, что вам нужно выбирать между сохранением вводящего в заблуждение названия и переписыванием каждой вызывающей его программы.+x
набором - гдеfoo.sh
находится библиотека , которая может быть получена в любой POSIX оболочку,foo.bash
может быть получена в Баш,foo.ksh
в KSH и т.д.Ответы:
Вы в замешательстве.
.sh
Расширение лишь намек на человек, и не имеет абсолютно никакого влияния на то, как система обрабатывает файл. Unix / Linux не сделалSecrets.pdf.exe
ошибку Windows .Вот что происходит, когда вы печатаете
foo
:Перенаправление для
STDIN
,STDOUT
иSTDERR
устанавливаются.Оболочка проверяет свою внутреннюю хеш-таблицу, чтобы узнать, знает ли она уже
$PATH
записьfoo
. Если ничего не существует, оболочка выполняет поиск в каталогах$PATH
, ища файл с именемfoo
, для которого установлен бит «Выполнить» в правах доступа к файлу. Первыеfoo
победы.Если первые два байта файла
foo
-#!
следующая строка, это имя интерпретатора для запуска. Таким образом,#!/bin/bash
вводится Bash-скрипт,#!/usr/bin/perl
Perl-скрипт и т. Д.Если файл начинается с
\177ELF
, это исполняемый двоичный файл, иld.so
запускает его.Прочитайте
man execve
иman ld.so
для более подробного объяснения.источник
chmod +x
) в значительной степени решает эту проблему, верно?x
бит для всего) и откуда пришел файл (любой процесс с контролем над каталогом может быть обманут в настройке разрешений) , Таким образом, это смягчает это, но я бы не сказал, что это решает это.Secrets.pdf.exe
потому что я всегда отключаю глупуюhide file extension
функциюКлючевой момент заключается в следующем: расширения не имеют значения в любой Unix-подобной системной системе. Имя файла является просто именем и не влияет на возможность запуска скрипта или скомпилированного исполняемого файла . Программист может добавить
.sh
расширение, чтобы указать, что файл является сценарием оболочки или.py
сценарием Python, но в отличие от Windows, любой Unix не заботится о наименовании, он заботится о разрешениях.Что имеет значение, так это исполняемое разрешение, предоставленное файлу. Который вы можете проверить с
Запуск исполняемых файлов
Для запуска скрипта есть несколько способов.
./my_script_name
..
Означает текущий каталог./home/user/bin/my_script_name
(Два вышеупомянутых метода основаны на том, чтобы иметь исполняемый набор разрешений; независимо от того, является ли файл частью
$PATH
переменной, значение не имеет. Наличие#!
строки также имеет значение; без него скрипт будет выполняться текущей оболочкой, которую вы открыли. Если у меня естьcsh
скрипт без этой строки, и попробуйте запустить его в bash./my_script.csh
, это не удастся)$PATH
переменной, вы можете запустить его, просто вызвав имя. Вы можете вызватьchmod
команду в командной строке, просто набрав ее имя, потому что она находится в/bin
папке./bin
всегда является частью$PATH
переменной. В этом случае исполняемые права доступа и местоположение скрипта имеют значение. filename.sh
илиsource filename.sh
сценарий будет обрабатываться так, как если бы он вводился с клавиатуры, т. Е. Как если бы он был введен непосредственно в командную строку. В этом случае исполняемые права доступа и местоположение не имеют значенияПримеры
Пример # 1, работающий с интерпретатором, для разрешения exec
Пример №2, работающий с
./
набором разрешений на исполняемый файл, набор строк shebang.Пример №3, работающий без установки строки shebang (не удается, потому что bash не может читать сценарии python; ни одна строка shebang не принимает текущую оболочку в качестве интерпретатора)
Пример # 4, запуск сценария, который имеет исполняемый набор прав доступа к папке формы, которая является частью
$PATH
переменнойПример № 5, удаляющий расширение, все еще выполняется, потому что расширения не имеют значения, но у него есть разрешения и он является частью
$PATH
:источник
PATH
?man chmod
чтобы узнать, как устанавливать разрешенияХорошие объяснения здесь уже. Я просто хотел добавить, что в идеале вы не должны использовать расширения файлов для исполняемых файлов.
Обычно вам нужно выполнить что-то относительно простое, и вы начинаете с небольшого сценария оболочки. Со временем вы начинаете добавлять все больше и больше функциональных возможностей в ваш скрипт, пока не придет время, когда он станет не поддерживаемым, или вам понадобятся некоторые функции, которые вы не можете легко реализовать с помощью скрипта оболочки, и подумаете о переписывании этого скрипта на другом языке (python , perl, ...?).
Переписывание с нуля обычно считается ошибкой, но для сценариев это может иметь смысл, поскольку обычно они невелики или имеют множество функций. Но давайте предположим, что выполнимо переписать с нуля на другом языке, поддерживая функциональность и параметры / параметры исходного сценария оболочки.
Пользователям этого скрипта не нужно знать об этом изменении языка, они будут продолжать выполнять ту же команду, и она продолжит работать.
Если ваш сценарий был назван
do-something.sh
, он может продолжать существоватьdo-something.sh
, но теперь он написан на python (например), и поэтому ваш начальный совет теперь полностью вводит в заблуждение.источник
Для запуска файлов без расширения вам обычно не нужно много делать, просто убедитесь, что у вас есть (в случае сценариев bash) правильная строка shebang в самой первой строке:
тогда вам также нужно сделать исполняемый файл для системы
Это так же, как использование
chmod +x yourfilename
чисел легко объяснить.Это число, состоящее из трех восьмеричных добавок, первое число обозначает пользователя, второе - группу, а третье - остальные, подробнее об этом вы можете узнать здесь .
И если вы находитесь в той же директории, что и ваш скрипт, не забудьте использовать
./
вот так:источник
Суффикс .sh на самом деле может помешать, потому что затем, чтобы запустить его, вы должны набрать myscript.sh вместо просто myscript, который не будет работать. Лучше просто назвать его «myscript» без суффикса .sh, и быстрое использование команды «file» скажет вам, является ли это двоичным исполняемым файлом (формат ELF в linux) или сценарием оболочки, или любым другим видом сценария.
QDOS (Quick and Dirty Operating System, позже переименованная в «DOS» IBM после того, как mirosoft скопировала его и незаконно продала ему) и другие дешевые копии CP / M, включая windows, смешивают все это, потому что в этих системах нет такая вещь, как разрешение на выполнение файлов. Это привело к бесчисленным группам безопасности за последние 30-40 лет. На самом деле всего несколько минут назад я только что получил несколько нежелательных писем с заминированным zip-файлом, переименованным в MYPICTURE.JPG.zip :)
источник