Arch Linux, jeśli mam ls -l
w /sbin
widzę, że reboot
, shutdown
i poweroff
są wszystkie dowiązania do /usr/bin/systemctl
. Ale wydawanie reboot
, shutdown
a systemctl
polecenia oczywiście nie wszyscy mają takie samo zachowanie.
Czy ls -l
nie pokazuje mi pełnych informacji na temat dowiązań symbolicznych? Jak mogę na przykład wiedzieć, czym jest prawdziwe dowiązanie symboliczne reboot
?
Odpowiedzi:
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
C
podczas pisania: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
:Oto konfiguracja systemu plików:
Teraz, gdy uruchamiam polecenia:
źródło
ssh-argv0
main
są odwrócone.argc
przychodzi wcześniejargv
.