Perché i link simbolici di riavvio, spegnimento e spegnimento di systemctl?


28

In Arch Linux, se lo faccio ls -lin /sbin, posso vedere che reboot, shutdowne poweroffsono tutti i collegamenti simbolici a /usr/bin/systemctl. Ma emissione reboot, shutdowne systemctlcomandi ovviamente non fa tutti hanno lo stesso comportamento.

Non ls -lmi sta mostrando tutte le informazioni relative ai symlink? Come posso, ad esempio, sapere qual è il vero link simbolico di reboot?


1
Per ulteriori informazioni, consultare unix.stackexchange.com/a/196014/5132 .
JdeBP,

Risposte:


42

Molti programmi fanno uso di questa tecnica in cui esiste un singolo eseguibile che modifica il suo comportamento in base alla modalità di esecuzione.

In genere c'è una struttura all'interno del programma chiamata un'istruzione case / switch che determina il nome con cui è stato chiamato l'eseguibile e quindi chiamerà la funzionalità appropriata per quel nome eseguibile. Quel nome è di solito il primo argomento ricevuto dal programma. Ad esempio, Cquando scrivi:

int main(int argc, char** argv)

argv[0]contiene il nome dell'eseguibile chiamato. Almeno, questo è il comportamento standard per tutte le shell e tutti gli eseguibili che usano argomenti dovrebbero esserne consapevoli.

Esempio in Perl

Ecco un esempio inventato che ho messo insieme in Perl che mostra anche la tecnica.

Ecco lo script attuale, chiamalo 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;

Ecco la configurazione del file system:

$ 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

Ora quando eseguo i miei comandi:

$ ./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-)

Vedi anche:ssh-argv0
Jordan

4
Ecco come funziona BusyBox. Ha un singolo binario che funge da maggior parte delle comuni utility GNU.
Nome falso

1
Gli argomenti al mainsono invertiti. argcviene prima argv.
Bakuriu,

4
in C, non è possibile creare un'istruzione switch con stringhe.
BatchyX,

3
+1 per "Non so chi sono" :)
un CVn del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.