Знак минус - это способ, которым система сообщает оболочке, что она вызывается как оболочка входа в систему, и для нее должен быть указан ~/.profile
(для Bourne-совместимых оболочек). Это верно для Linux, OSX и любого другого Unix. Скрипт не будет запущен в оболочке входа в систему. Для сценария $0
- это имя файла сценария (с полным путем или без него).
ДОБАВЛЕНО: Справочная страница объясняет (почти все) различные случаи:
«Если bash вызывается с файлом команд, в качестве имени этого файла устанавливается $ 0». Это касается сценариев, выполняемых с помощью bash myscript
, а также косвенного случая, когда сценарий выполняется непосредственно и начинается с #!/bin/bash
.
«Если bash запускается с параметром -c, то $ 0 устанавливается в качестве первого аргумента после строки, которая должна быть выполнена, если она есть». С -c
$0
устанавливается на то, что явно указывает вызывающая сторона.
«В противном случае ему присваивается имя файла, используемое для вызова bash, как указано в нулевом аргументе». Оболочка входа в систему попадает в этот случай: оболочка вызывается без аргументов, кроме аргумента ноль, поэтому $0
устанавливается в качестве аргумента ноль. Он login
в системе, su
или любая программа обработал логин , который выбирает аргументы , что передаваемое в оболочку, и присоединяет -
аргумент нулевого сказать оболочку , что это Войти оболочки.
Возможно, какое-то объяснение нулевого аргумента в порядке. Когда программа выполняется, в конечном счете, происходит системный вызов execve
. Этот системный вызов принимает три аргумента:
имя файла, которое должно обозначать существующий исполняемый файл. Ядро загружает этот файл и передает ему выполнение.
массив строк, называемых аргументами. Элемент с нулем в этом массиве, как правило, имеет то же имя файла, что и выше, или просто имя файла без полного пути, если местоположение исполняемого файла было определено путем поиска переменной среды $PATH
. Есть исключения из этого соглашения, такие как оболочки входа в систему.
другой массив строк, называемый окружением.
Когда вы вызываете программу из оболочки, набирая myprogram foo bar
, аргументы execve
:
1. /usr/bin/myprogram
(при условии, что именно здесь оболочка нашла myprogram
)
2. myprogram
, foo
, bar
3. для каждой экспортируемой переменной оболочки, имя переменной, затем знак равенства и значение.
Не существует общего способа найти имя исполняемого файла, который был передан execve
из запущенной программы. В Linux он обычно доступен как /proc/$$/exe
где $$
- идентификатор процесса. Каждый Unix делает его доступным для ps
но внутренняя работа ps
сильно отличается. Исполняемый файл может быть удален или переименован во время работы программы; в этом случае ps
может сообщать устаревшую информацию или не предоставлять никакой информации.