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

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

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

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

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

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

Спасибо.

9
задан 16 July 2012 в 15:14

3 ответа

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

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

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

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

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

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

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

0
ответ дан 16 July 2012 в 15:14

Вот быстрый список команд. Отметьте, когда я упоминаю ПУТЬ, я имею в виду каталоги, содержащие программы, о которых знает система; Вы находите тех, которые имеют 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
  • Скрипты могут также быть запущены с аргументами; как объяснено в Руте (p. 68): myfile.sh dogs cats birds произведет The first argument is: dogs, second argument is: cats, third argument is: birds потому что содержание этого сценария после хижины: echo "The first argument is: $1, second argument is: $2, third argument is: $3"

  • Для выполнения сценария в другом каталоге использовать ~/Scripts/dogs.sh

  • Для выполнения сценария, который система знает о том, потому что это находится в папке мусорного ведра в корневом каталоге (просто создают его, если это не там, как это будет автоматически добавлено к ПУТИ), просто используйте scriptname
  • Для выполнения сценария, Вы установили, снова просто используйте его имя, потому что он будет известен системе: например, get_iplayer

Двоичные файлы

  • Для выполнения двоичного файла, который система знает о том, потому что это находится в $PATH используйте название программы и любых параметров, например, vlc <stream url to open>
  • Для тестирования двоичного файла, Вы скомпилировали прежде, чем установить на/usr/local/bin или держать автономную программу отдельно от системы, использовать ~/<folder>/app/myprog
2
ответ дан 16 July 2012 в 15:14

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

Сначала отметим два момента:

  • Linux различает команду и путь [ 1121]. Команда вводится только как есть в приглашении и выполняет встроенную функцию или заставит 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 будет игнорировать ее bang и используйте в этом случае sh в качестве интерпретатора
  • Использование . script или source проигнорирует she-bang и использует текущий интерпретатор (поскольку . или source эквивалентны просто выполнить каждую строку скрипта в текущей оболочке)

Сноски

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

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

0
ответ дан 16 July 2012 в 15:14

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

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