Знак минус - это способ, которым система сообщает оболочке, что она вызывается как оболочка входа в систему, и для нее должен быть указан ~/.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 может сообщать устаревшую информацию или не предоставлять никакой информации.