Я использую Linux уже некоторое время, и я искал полный обзор этого, но не нашел.
Я просто не примиряюсь со всеми различными способами выполнения сценариев и двоичных файлов - для меня это большой беспорядок, и я должен использовать метод проб и ошибок, чтобы определить, что мне следует использовать. Для файла, который представляет собой скрипт или двоичный файл <script/binary>
, я могу предложить следующие альтернативы:
<script/binary>
. <script/binary>
./<script/binary>
source <script/binary>
sh <script/binary>
(есть ли еще?)
Может ли кто-нибудь дать полный обзор из каких команд работают с какими типами файлов, и какая разница, когда есть несколько вариантов?
Спасибо.
Следующие команды одинаковы, точечный компонент означает «текущий каталог». Чтобы разрешить выполнение, файлы должны иметь права на выполнение:
path/to/binary
./path/to/binary
Обратите внимание, что если путь не содержит косую черту, он рассматривается как команда (встроенная оболочка или программа). это ищется в переменной окружения $PATH
).
Следующее почти то же самое, они выполняют сценарий оболочки (не двоичный файл!) В текущей среде оболочки. Небольшая разница между двумя строками описана в этом вопросе Unix.SE .
. path/to/script
source path/to/script
Наконец, вы упомянули sh script
. Опять же, это работает только для сценариев оболочки , но не для двоичных файлов. Вы в основном выполняете программу sh
с именем скрипта в качестве аргумента. В случае sh
он просто обрабатывает этот аргумент как сценарий оболочки и выполняет его.
Ответы, ограниченные сценариями оболочки, см. В Различные способы выполнения сценария оболочки .
Вот быстрый список команд. Отметьте, когда я упоминаю ПУТЬ, я имею в виду каталоги, содержащие программы, о которых знает система; Вы находите тех, которые имеют 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
Двоичные файлы
vlc <stream url to open>
~/<folder>/app/myprog
Спасибо за все комментарии. Сейчас я постараюсь ответить на свой вопрос и дать полное руководство по различным возможностям выполнения скриптов и двоичных файлов. Пожалуйста, отредактируйте и прокомментируйте, и мы сможем придумать что-то полное и правильное. Вот мое предложение:
Сначала отметим два момента:
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» выполнить «скрипт» в его новой оболочке