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, C
cuando 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-)