Различные способы выполнения двоичных файлов и скриптов

Я уже некоторое время использую Linux, и я искал полный обзор этого, но не нашел.

Я просто не соглашаюсь со всеми различными способами выполнения скриптов и двоичных файлов – для меня это большой беспорядок, и я должен использовать пробную ошибку, чтобы определить, что я должен использовать. Для файла, который является скриптом или двоичным <script/binary> , я могу найти следующие альтернативы:

 <script/binary> . <script/binary> ./<script/binary> source <script/binary> sh <script/binary> 

(Есть еще?)

Может ли кто-нибудь дать полный обзор того, какие команды работают с файлами какого типа, и какова разница, когда есть несколько вариантов?

Благодарю.

Следующие команды одинаковы, точечный компонент означает «текущий каталог». Чтобы разрешить выполнение, файлы должны иметь исполняемые разрешения:

 path/to/binary ./path/to/binary 

Обратите внимание: если путь не содержит косой черты, он рассматривается как команда (либо встроенная оболочка, либо программа, которая просматривается в $PATH среды $PATH ).

Следующие почти то же самое, они выполняют сценарий оболочки (а не двоичный!) В текущей среде оболочки. Небольшое различие между двумя строками описано в этом вопросе Unix.SE.

 . path/to/script source path/to/script 

Наконец, вы упомянули sh script . Опять же, это работает только для сценариев оболочки, а не для двоичных файлов. Вы в основном выполняете программу sh с именем сценария в качестве аргумента. В случае sh он просто рассматривает этот аргумент как скрипт оболочки и выполняет его.

Для ответов, ограниченных shellscripts, см. Различные способы выполнения сценария оболочки .

Ниже приведен список команд. Заметьте, когда я упоминаю PATH, я имею в виду каталоги, содержащие программы, о которых система знает; вы найдете те, у кого есть echo $PATH , и это будет что-то вроде: /home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Сценарии

  • Чтобы выполнить скрипт в текущем рабочем каталоге, используйте ./myscript.sh
  • Чтобы выполнить скрипт в другом файле, используйте (если он находится в текущем рабочем каталоге), ./myscript.sh textfile.txt
  • Сценарии также могут запускаться с аргументами; как объяснено в Rute (стр. 68): myfile.sh dogs cats birds The first argument is: dogs, second argument is: cats, third argument is: birds потому что содержание этого скрипта после shebang: echo "The first argument is: $1, second argument is: $2, third argument is: $3"

  • Чтобы выполнить скрипт в другом каталоге, используйте ~/Scripts/dogs.sh

  • Чтобы выполнить скрипт, который система знает, потому что он находится в вашей папке bin в вашем домашнем каталоге (просто создайте его, если его нет, так как он будет автоматически добавлен в ваш PATH), просто используйте имя scriptname
  • Чтобы выполнить скрипт, который вы установили, снова просто используйте его имя, потому что оно будет известно системе: например, get_iplayer

Бинарные

  • Чтобы запустить двоичный файл, который система знает, потому что он находится в $ PATH, используйте имя программы и любые параметры, например, vlc <stream url to open>
  • Чтобы протестировать двоичный файл, который вы скомпилировали перед установкой в ​​/ usr / local / bin или для того, чтобы ~/<folder>/app/myprog автономную программу от системы, используйте ~/<folder>/app/myprog

Спасибо за все входные данные. Я постараюсь ответить на мой собственный вопрос сейчас и дать полное руководство по различным возможностям выполнения скриптов и двоичных файлов. Пожалуйста, отредактируйте и прокомментируйте, и мы сможем придумать что-то полное и правильное. Вот мое предложение:

Сначала нужно указать два момента:

  • Linux делает различие между командой и контуром . Команда набирается только как-есть в приглашении и будет выполнять встроенный или заставит Linux искать соответствующий двоичный файл или скрипт в $ PATH.

  • Чтобы Linux интерпретировал что-то как путь, он должен содержать хотя бы одну косую черту (/). Например, в ./myScript , ./ может показаться довольно избыточным – только там, чтобы заставить Linux интерпретировать его как путь, а не команду.

Итак, варианты выполнения двоичного файла или скрипта:

Выполнение двоичного binary :

 $ binary # when 'binary' is on the PATH, or is a built-in $ ./binary # when 'binary' is not on the path but in the current directory $ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir 

Выполнение скриптового script :

Файл должен иметь разрешения на выполнение, если не указано иное.

 $ script # execute a script that is on PATH. Will be executed in a new shell. # The interpreter to use is determined by the she-bang in the file. $ ./script # execute a script that is in the current dir. Otherwise as above. $ /a/dir/script # when the script is not on the PATH and not in current dir. # Otherwise as above. $ . script # execute a script in the current dir. Will be executed in the # current shell environment. $ source script # equivalent to the above *1 $ sh script # executes 'script' in a new shell *2 (the same goes for 'bash ...', # 'zsh ...' etc.). Execute permission not neccessary. 

О she-bangs :

Скрипты с she-bang (например, #!/bin/sh ) в первой строке указывают, какой интерпретатор использовать.

  • Этот интерпретатор будет использоваться при выполнении ./script или с использованием команды: script ( script должен находиться в PATH)
  • Использование sh script будет игнорировать she-bang и использовать в этом случае sh в качестве интерпретатора
  • Использование . script . script или source игнорируют she-bang и используют текущий интерпретатор (поскольку . или source эквивалентен просто выполнению каждой строки скрипта в текущей оболочке)

Сноски

* 1: Это почти верно. В bash они действительно являются одной и той же командой, но при использовании source script будет искать в $ PATH до текущего каталога. Это bash, но в оболочках POSIX source не работает, но . делает. Поэтому используйте последнюю для переносимости.

* 2: что на самом деле происходит, так это то, что мы запускаем двоичный sh с «скриптом» в качестве аргумента, который заставит «sh» выполнить «скрипт» в своей новой оболочке