¿Por qué los enlaces simbólicos de reinicio, apagado y apagado de systemctl?

28

En Arch Linux, si lo hago ls -len /sbin, puedo ver que reboot, shutdowny poweroffson todos los enlaces simbólicos a /usr/bin/systemctl. Pero la emisión reboot, shutdowny systemctllos comandos, obviamente, no todos tienen el mismo comportamiento.

¿ ls -lNo me muestra información completa sobre los enlaces simbólicos? ¿Cómo puedo, por ejemplo, saber cuál es el enlace simbólico real reboot?

Gradiente
fuente
1
Para obtener más información sobre esto, consulte unix.stackexchange.com/a/196014/5132 .
JdeBP

Respuestas:

42

Muchos programas hacen uso de esta técnica donde hay un solo ejecutable que cambia su comportamiento en función de cómo se ejecutó.

Normalmente hay una estructura dentro del programa llamada declaración de caso / interruptor que determina el nombre con el que se llamó al ejecutable y luego llamará a la funcionalidad apropiada para ese nombre ejecutable. Ese nombre suele ser el primer argumento que recibe el programa. Por ejemplo, Ccuando escribes:

int main(int argc, char** argv)

argv[0]contiene el nombre del ejecutable llamado. Al menos, este es el comportamiento estándar para todos los shells, y todos los ejecutables que usan argumentos deben tenerlo en cuenta.

Ejemplo en Perl

Aquí hay un ejemplo artificial que preparé en Perl que muestra la técnica también.

Aquí está el guión real, llámelo 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;

Aquí está la configuración del sistema de archivos:

$ 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

Ahora cuando ejecuto mis comandos:

$ ./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
fuente
Ver también:ssh-argv0
jordanm
44
Así es como funciona BusyBox. Tiene un solo binario que actúa como la mayoría de las utilidades comunes de GNU.
Nombre falso
1
Los argumentos a la mainse invierten. argcviene antes argv.
Bakuriu
44
en C, no puede hacer una declaración de cambio con cadenas.
BatchyX
3
+1 para "No sé quién soy" :)
un CVn