Почему там знак "минус" в “0$” на Mac?

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

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

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

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

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

* Глупый я. Конечно, 0$ оценят к названию сценария, как указано в руководстве

6
задан 12.09.2010, 15:27

3 ответа

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

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

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

  • “Если удар запускается с-c опции, то 0$ установлены на первый аргумент после строки быть выполненными, если Вы присутствуете”. С -c, $0 установлен на то, на что явно указывает вызывающая сторона.

  • “Иначе это установлено на имя файла, используемое для вызова удара, как дано нулем аргумента”. Оболочка входа в систему попадает в этот случай: оболочка вызывается без аргументов кроме нуля аргумента, таким образом, $0 установлен на нуль аргумента. Это login, su, или независимо от того, что программа обработала вход в систему, который выбирает аргументы, что это передало оболочке и предварительно ожидает a - к нулю аргумента, чтобы сказать оболочку, что это - оболочка входа в систему.

Возможно, некоторое объяснение нуля аргумента в порядке. Когда программа выполнена, в конечном счете, 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 мог бы сообщить устаревшую информацию или никакую информацию.

6
ответ дан 07.12.2019, 16:04

От man bash:

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

1
ответ дан 07.12.2019, 16:04

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

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

0
ответ дан 07.12.2019, 16:04

Теги

Похожие вопросы