Warum sind Neustart, Herunterfahren und Ausschalten mit systemctl verknüpft?

28

In Arch Linux, wenn ich ls -lin /sbin, kann ich sehen , dass reboot, shutdownund poweroffsind alle Symlinks /usr/bin/systemctl. Aber die Ausstellung reboot, shutdownund systemctlBefehle offensichtlich nicht alle das gleiche Verhalten.

Ist ls -lzeigt mir nicht die volle Information über Symlinks? Wie kann ich zum Beispiel wissen, was der wahre Symlink von rebootist?

Gradient
quelle
1
Weitere Informationen hierzu finden Sie unter unix.stackexchange.com/a/196014/5132 .
JdeBP

Antworten:

42

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, Cwenn Sie schreiben:

int main(int argc, char** argv)

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:

#!/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;

Hier ist das Dateisystem-Setup:

$ 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

Wenn ich jetzt meine Befehle ausführe:

$ ./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
quelle
Siehe auch:ssh-argv0
Jordanien
4
So funktioniert eigentlich BusyBox. Es hat eine einzige Binärdatei, die wie die meisten gängigen GNU-Dienstprogramme funktioniert.
Fake Name
1
Die Argumente zum mainsind umgekehrt. argckommt vor argv.
Bakuriu
4
In C können Sie keine switch-Anweisung mit Zeichenfolgen erstellen.
BatchyX
3
+1 für "Ich weiß nicht, wer ich bin" :)
ein CVn