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

11

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

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

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

(Есть еще?)

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

Спасибо.

деревенщина
источник

Ответы:

7

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

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

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

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

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

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

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

Lekensteyn
источник
3

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

Сначала два пункта, чтобы заявить:

  • 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.

О челки :

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

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

Сноски

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

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

деревенщина
источник
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потому что содержимое этого сценария после шебанга: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

источник
Спасибо за информацию. Правильно ли это утверждение: чтобы выполнить скрипт или бинарный файл не в PATH, нужно просто указать его путь. Причина ./ необходима для сценария в текущем пути в том, что просто «script.sh» будет интерпретироваться как команда, поскольку в нем отсутствует хотя бы одна косая черта /.
Карл
«Чтобы выполнить скрипт, который вы установили», что такое скрипт, который я «установил»? Эта точка говорит то же, что и предыдущая точка?
Карл
@ Carl - ваш первый комментарий верен, но нельзя сказать, что мои последние два пункта о сценариях совпадают. В пункте 5 раздела сценариев я говорил о сценариях, которые пользователь вручную добавил в свою папку bin в своем домашнем каталоге; в пункте 6 я говорил о таких скриптах, как get_iplayer, которые они установили из репозиториев и поэтому всегда идут в системные папки, а не в домашний каталог пользователя.
Извините, но я все еще не понимаю, сценарий в ~ / bin / (который находится в PATH) или в системной папке (который находится в PATH) - как может быть разница между ними? Они ведут себя по-другому?
Карл
Я просто делал различие между теми сценариями, которые пользователь имеет и добавляет в ~ / bin, и теми, которые принадлежат пользователю root в системных папках.