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

6

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

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

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

(Есть ли еще?)

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

Спасибо.

    
задан Carl 16.07.2012 в 12:40
источник

3 ответа

3

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

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

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

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

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

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

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

    
ответ дан Lekensteyn 16.07.2012 в 13:07
2

Ниже приведен список команд. Заметьте, когда я упоминаю 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: , second argument is: , third argument is: "

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

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

Бинарные

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

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

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

  • 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 или source игнорирует she-bang и использует текущий интерпретатор (поскольку . или source эквивалентно просто выполнению каждой строки скрипта в текущей оболочке)

Сноска

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

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

    
ответ дан Carl 26.07.2012 в 23:52