
Когда вы пишете в терминале «vim filename», я знаю, что vim получает filename в качестве параметра, но предполагаю, что и программа тоже получает vim в качестве параметра... это просто эмулятор терминала или другая программа?
решение1
В тот момент, когда вы вводите данные vim filename
в командной строке, оболочка уже запущена, поэтому оболочка (и эмулятор терминала) не получает vim
аргумент командной строки.
vim
, с другой стороны, делает, но это не доступно пользователю. Когда программа запускается, ее имяобычнозадан как нулевой аргумент командной строки. Вы можете увидеть это, запустив оболочку и выполнив команду echo $0
:
$ sh
$ echo $0
sh
$ exit
Оболочка выполняет команды в командной строке с помощью execve()
(или аналогичной exec()
функции), чьяСпецификация POSIXговорит
Значение
argv[0]
должно указывать на строку имени файла, связанную с процессом, запускаемым одной из функцийexec
.
argv[0]
в тексте выше соответствует $0
в скрипте оболочки.
В разделе «Обоснование» далее говорится:
Требование к приложению, строго соответствующему POSIX, также гласит, чтозначение, переданное в качестве первого аргумента, должно быть строкой имени файла, связанной с запускаемым процессом. Хотя некоторые существующие приложения передают имя пути, а не строку имени файла в некоторых обстоятельствах, строка имени файла более полезна, поскольку обычно используется
argv[0]
при печати диагностики. В некоторых случаях переданное имя файла не является фактическим именем файла; например, многие реализации утилиты входа используют соглашение о добавлении префикса<hyphen-minus>
(-
) к фактическому имени файла, что указывает вызываемому интерпретатору команд, что это «оболочка входа».