Чому перезавантаження, вимкнення та переключення потужності посилаються на systemctl?


28

Якщо я працюю ls -lв Arch Linux, /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-)

Дивіться також:ssh-argv0
jordanm

4
Це насправді, як працює BusyBox. Він має єдиний двійковий файл, який виступає як більшість загальних утиліт GNU.
Підроблена назва

1
Аргументи на адресу mainзворотні. argcприходить раніше argv.
Бакуріу

4
в C ви не можете зробити оператор перемикання з рядками.
BatchyX

3
+1 за "Я не знаю, хто я" :)
CVn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.