In Arch Linux, wenn ich ls -l
in /sbin
, kann ich sehen , dass reboot
, shutdown
und poweroff
sind alle Symlinks /usr/bin/systemctl
. Aber die Ausstellung reboot
, shutdown
und systemctl
Befehle offensichtlich nicht alle das gleiche Verhalten.
Ist ls -l
zeigt mir nicht die volle Information über Symlinks? Wie kann ich zum Beispiel wissen, was der wahre Symlink von reboot
ist?
Antworten:
Viele Programme verwenden diese Technik, wenn es eine einzelne ausführbare Datei gibt, deren Verhalten sich nach der Ausführung richtet.
Das Programm enthält normalerweise eine Struktur mit der Bezeichnung case / switch, die den Namen der ausführbaren Datei bestimmt und dann die entsprechende Funktionalität für diesen ausführbaren Namen aufruft. Dieser Name ist normalerweise das erste Argument, das das Programm erhält. Zum Beispiel,
C
wenn Sie schreiben:argv[0]
Enthält den Namen der aufgerufenen ausführbaren Datei. Zumindest ist dies das Standardverhalten für alle Shells, und alle ausführbaren Dateien, die Argumente verwenden, sollten sich dessen bewusst sein.Beispiel in Perl
Hier ist ein ausgedachtes Beispiel, das ich in Perl zusammengestellt habe und das auch die Technik zeigt.
Hier ist das eigentliche Skript, nennen Sie es
mycmd.pl
:Hier ist das Dateisystem-Setup:
Wenn ich jetzt meine Befehle ausführe:
quelle
ssh-argv0
main
sind umgekehrt.argc
kommt vorargv
.