В Arch Linux, если я ls -l
в /sbin
, я могу видеть , что reboot
, shutdown
и poweroff
все символические ссылки на /usr/bin/systemctl
. Но выпуск reboot
, shutdown
и systemctl
команды , очевидно , не все имеют такое же поведение.
Разве ls -l
не отображается полная информация о символических ссылках? Как я могу, например, узнать, что такое настоящая символическая ссылка reboot
?
Ответы:
Многие программы используют эту технику, когда существует один исполняемый файл, который меняет свое поведение в зависимости от того, как он был выполнен.
Обычно внутри программы есть структура, называемая оператором case / switch, которая определяет имя, с которым вызывался исполняемый файл, и затем вызывает соответствующие функции для этого имени исполняемого файла. Это имя обычно является первым аргументом, который получает программа. Например,
C
когда вы пишете:argv[0]
содержит имя вызываемого исполняемого файла По крайней мере, это стандартное поведение для всех оболочек, и все исполняемые файлы, использующие аргументы, должны знать об этом.Пример в Perl
Вот надуманный пример, который я собрал в Perl, который также демонстрирует технику.
Вот собственно скрипт, назовите его
mycmd.pl
:Вот настройка файловой системы:
Теперь, когда я запускаю свои команды:
источник
ssh-argv0
main
обратного.argc
приходит раньшеargv
.