Pourquoi les liens symboliques de redémarrage, d'arrêt et de mise hors tension vers systemctl?

28

Arch Linux, si je le fais ls -ldans /sbin, je peux voir que reboot, shutdownet poweroffsont tous les liens symboliques à /usr/bin/systemctl. Mais l' émission reboot, shutdownet des systemctlcommandes n'a évidemment pas tout le même comportement.

Ne ls -lme montre pas toutes les informations concernant les liens symboliques? Comment puis-je, par exemple, savoir quel est le véritable lien symbolique reboot?

Pente
la source
1
Pour plus d'informations à ce sujet, voir unix.stackexchange.com/a/196014/5132 .
JdeBP

Réponses:

42

De nombreux programmes utilisent cette technique lorsqu'il existe un seul exécutable qui modifie son comportement en fonction de la façon dont il a été exécuté.

Il existe généralement une structure à l'intérieur du programme appelée une instruction case / switch qui détermine le nom avec lequel l'exécutable a été appelé, puis appellera la fonctionnalité appropriée pour ce nom d'exécutable. Ce nom est généralement le premier argument reçu par le programme. Par exemple, Clorsque vous écrivez:

int main(int argc, char** argv)

argv[0]contient le nom de l'exécutable appelé. Au moins, c'est le comportement standard pour tous les shells, et tous les exécutables qui utilisent des arguments doivent en être conscients.

Exemple en Perl

Voici un exemple artificiel que j'ai mis en place en Perl qui montre également la technique.

Voici le script réel, appelez-le 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;

Voici la configuration du système de fichiers:

$ 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

Maintenant, quand j'exécute mes commandes:

$ ./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
la source
Voir aussi:ssh-argv0
jordanm
4
C'est en fait ainsi que fonctionne BusyBox. Il a un seul binaire qui agit comme la plupart des utilitaires GNU courants.
Fake Name
1
Les arguments de la mainsont inversés. argcvient avant argv.
Bakuriu
4
en C, vous ne pouvez pas faire une instruction switch avec des chaînes.
BatchyX
3
+1 pour "Je ne sais pas qui je suis" :)
un CVn