Почему перезагрузки, выключения и отключения питания символические ссылки на systemctl?

28

В Arch Linux, если я ls -lв /sbin, я могу видеть , что reboot, shutdownи poweroffвсе символические ссылки на /usr/bin/systemctl. Но выпуск reboot, shutdownи systemctlкоманды , очевидно , не все имеют такое же поведение.

Разве ls -lне отображается полная информация о символических ссылках? Как я могу, например, узнать, что такое настоящая символическая ссылка reboot?

градиент
источник
1
Подробнее об этом см. Unix.stackexchange.com/a/196014/5132 .
JdeBP

Ответы:

42

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

Обычно внутри программы есть структура, называемая оператором case / switch, которая определяет имя, с которым вызывался исполняемый файл, и затем вызывает соответствующие функции для этого имени исполняемого файла. Это имя обычно является первым аргументом, который получает программа. Например, Cкогда вы пишете:

int main(int argc, char** argv)

argv[0]содержит имя вызываемого исполняемого файла По крайней мере, это стандартное поведение для всех оболочек, и все исполняемые файлы, использующие аргументы, должны знать об этом.

Пример в Perl

Вот надуманный пример, который я собрал в Perl, который также демонстрирует технику.

Вот собственно скрипт, назовите его mycmd.pl:

#!/usr/bin/perl

use feature ':5.10';

(my $arg = $0) =~ s#./##;

my $msg = "I was called as: ";

given ($arg) {
  $msg .= $arg  when 'ls';
  $msg .= $arg  when 'find';
  $msg .= $arg  when 'pwd';
  default { $msg = "Error: I don't know who I am 8-)"; }
}

say $msg;
exit 0;

Вот настройка файловой системы:

$ ls -l
total 4
lrwxrwxrwx 1 saml saml   8 May 24 20:49 find -> mycmd.pl
lrwxrwxrwx 1 saml saml   8 May 24 20:34 ls -> mycmd.pl
-rwxrwxr-x 1 saml saml 275 May 24 20:49 mycmd.pl
lrwxrwxrwx 1 saml saml   8 May 24 20:49 pwd -> mycmd.pl

Теперь, когда я запускаю свои команды:

$ ./find 
I was called as: find

$ ./ls
I was called as: ls

$ ./pwd
I was called as: pwd

$ ./mycmd.pl 
Error: I don't know who I am 8-)
SLM
источник
Смотрите также:ssh-argv0
Иордания
4
Это на самом деле, как работает BusyBox. У него есть один двоичный файл, который действует как большинство обычных утилит GNU.
Фальшивое имя
1
Аргументы в пользу mainобратного. argcприходит раньше argv.
Бакуриу
4
в C вы не можете сделать оператор switch со строками.
BatchyX
3
+1 за «я не знаю, кто я» :)
CVn