Dlaczego dowiązania symboliczne do restartu, wyłączania i wyłączania do systemctl?

28

Arch Linux, jeśli mam ls -lw /sbinwidzę, że reboot, shutdowni poweroffsą wszystkie dowiązania do /usr/bin/systemctl. Ale wydawanie reboot, shutdowna systemctlpolecenia oczywiście nie wszyscy mają takie samo zachowanie.

Czy ls -lnie pokazuje mi pełnych informacji na temat dowiązań symbolicznych? Jak mogę na przykład wiedzieć, czym jest prawdziwe dowiązanie symboliczne reboot?

Gradient
źródło
1
Więcej informacji na ten temat można znaleźć na stronie unix.stackexchange.com/a/196014/5132 .
JdeBP

Odpowiedzi:

42

Wiele programów korzysta z tej techniki, gdy istnieje jeden plik wykonywalny, który zmienia swoje zachowanie w zależności od sposobu jego wykonania.

Zazwyczaj w programie znajduje się struktura nazywana instrukcją case / switch, która określa nazwę, z którą został wywołany plik wykonywalny, a następnie wywołuje odpowiednią funkcjonalność dla tej nazwy pliku wykonywalnego. Ta nazwa jest zwykle pierwszym argumentem otrzymywanym przez program. Na przykład Cpodczas pisania:

int main(int argc, char** argv)

argv[0]zawiera nazwę wywoływanego pliku wykonywalnego. Przynajmniej jest to standardowe zachowanie wszystkich powłok i wszystkie pliki wykonywalne, które używają argumentów, powinny o tym wiedzieć.

Przykład w Perlu

Oto wymyślony przykład, który stworzyłem w Perlu, który pokazuje również technikę.

Oto rzeczywisty skrypt, nazwij go 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;

Oto konfiguracja systemu plików:

$ 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

Teraz, gdy uruchamiam polecenia:

$ ./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
źródło
Zobacz także:ssh-argv0
Jordan
4
Tak właśnie działa BusyBox. Ma jeden plik binarny, który działa jak większość popularnych narzędzi GNU.
Fałszywe imię
1
Argumenty do mainsą odwrócone. argcprzychodzi wcześniej argv.
Bakuriu
4
w C nie można wykonać instrukcji switch z ciągami.
BatchyX
3
+1 za „Nie wiem kim jestem” :)
CVn