web-dev-qa-db-fra.com

Pourquoi le redémarrage, l'arrêt et le PowerOff Symlinks sont-ils à SystemCTL?

En Arch Linux, si je fais ls -l dans /sbin, Je peux voir que reboot, shutdown et poweroff sont tous symboliques à /usr/bin/systemctl. Mais émettant reboot, shutdown et systemctl _ commandes n'a évidemment pas le même comportement.

Est ls -l ne me montrant pas des informations complètes sur les liens symboliques? Comment puis-je, par exemple, savoir ce que le vrai symbole symbolique de reboot est?

28
Gradient

De nombreux programmes utilisent cette technique où il existe une seule exécutable qui change de comportement basé sur la manière dont elle a été exécutée.

Il y a généralement une structure à l'intérieur du programme appelé instruction de cas/interrupteur qui détermine le nom de l'exécutable, puis appellera la fonctionnalité appropriée pour ce nom exécutable. Ce nom est généralement le premier argument que le programme reçoit. Par exemple, dans C lorsque vous écrivez:

int main(int argc, char** argv)

argv[0] contient le nom de l'exécutable appelé. Au moins, il s'agit du comportement standard pour toutes les coquilles et tous les exécutables qui utilisent des arguments doivent en être conscients.

Exemple de perl

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

Voici le script actuel, 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-)
42
slm