5

Я был пользователем GNU/Linux в течение многих лет, но я не могу понять, как получить полезную информацию о процессах на Mac.

Я понял, что $0 разрешает -bash в моей оболочке входа в Mac OS (Snow Leopard). Это может нарушить некоторые сценарии оболочки, которые отлично работают в среде Linux *.

К сожалению, на man-странице не упоминается этот факт

Если bash вызывается с файлом команд, в качестве имени этого файла задается $ 0. Если bash запускается с параметром -c, то $ 0 устанавливается в качестве первого аргумента после строки, которая должна быть выполнена, если она есть. В противном случае ему присваивается имя файла, используемое для вызова bash, как указано в нулевом аргументе.

Имеет ли знак минус особое значение? Есть ли что-то вроде /proc или инструмент командной строки, который может помочь мне найти связанный исполняемый файл?

* Дурак я. Конечно, $ 0 будет соответствовать названию скрипта, как указано в руководстве

3 ответа3

6

Знак минус - это способ, которым система сообщает оболочке, что она вызывается как оболочка входа в систему, и для нее должен быть указан ~/.profile (для Bourne-совместимых оболочек). Это верно для Linux, OSX и любого другого Unix. Скрипт не будет запущен в оболочке входа в систему. Для сценария $0 - это имя файла сценария (с полным путем или без него).

ДОБАВЛЕНО: Справочная страница объясняет (почти все) различные случаи:

  • «Если bash вызывается с файлом команд, в качестве имени этого файла устанавливается $ 0». Это касается сценариев, выполняемых с помощью bash myscript , а также косвенного случая, когда сценарий выполняется непосредственно и начинается с #!/bin/bash .

  • «Если bash запускается с параметром -c, то $ 0 устанавливается в качестве первого аргумента после строки, которая должна быть выполнена, если она есть». С -c $0 устанавливается на то, что явно указывает вызывающая сторона.

  • «В противном случае ему присваивается имя файла, используемое для вызова bash, как указано в нулевом аргументе». Оболочка входа в систему попадает в этот случай: оболочка вызывается без аргументов, кроме аргумента ноль, поэтому $0 устанавливается в качестве аргумента ноль. Он login в системе, su или любая программа обработал логин , который выбирает аргументы , что передаваемое в оболочку, и присоединяет - аргумент нулевого сказать оболочку , что это Войти оболочки.

Возможно, какое-то объяснение нулевого аргумента в порядке. Когда программа выполняется, в конечном счете, происходит системный вызов execve . Этот системный вызов принимает три аргумента:

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

  2. массив строк, называемых аргументами. Элемент с нулем в этом массиве, как правило, имеет то же имя файла, что и выше, или просто имя файла без полного пути, если местоположение исполняемого файла было определено путем поиска переменной среды $PATH . Есть исключения из этого соглашения, такие как оболочки входа в систему.

  3. другой массив строк, называемый окружением.

Когда вы вызываете программу из оболочки, набирая myprogram foo bar , аргументы execve :
    1. /usr/bin/myprogram (при условии, что именно здесь оболочка нашла myprogram)
    2. myprogram , foo , bar
    3. для каждой экспортируемой переменной оболочки, имя переменной, затем знак равенства и значение.

Не существует общего способа найти имя исполняемого файла, который был передан execve из запущенной программы. В Linux он обычно доступен как /proc/$$/exe где $$ - идентификатор процесса. Каждый Unix делает его доступным для ps но внутренняя работа ps сильно отличается. Исполняемый файл может быть удален или переименован во время работы программы; в этом случае ps может сообщать устаревшую информацию или не предоставлять никакой информации.

1

От man bash:

exec [-cl] [-a имя] [команда [аргументы]]
Если указана команда, она заменяет оболочку. Новый процесс не создан. Аргументы становятся аргументами команды. Если указана опция -l, оболочка помещает тире в начало нулевого аргумента, передаваемого команде. Это то, что делает логин (1). ...

0

Я не уверен, что происходит с параметром -bash, но если вы снова запустите bash в командной оболочке, значение $ 0 будет в порядке.

Кажется, это что-то особенное, что делает os x, потому что если вы запустите /usr /bin /login, который является сценарием по умолчанию, используемым терминальной программой, возникает та же проблема с $ 0.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .