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