Muitos programas fazem uso dessa técnica onde há um único executável que altera seu comportamento com base em como ele foi executado.
Normalmente, existe uma estrutura dentro do programa chamada instrução case / switch que determina o nome com o qual o executável foi chamado e, em seguida, chamará a funcionalidade apropriada para esse nome do executável. Esse nome geralmente é o primeiro argumento que o programa recebe. Por exemplo, C
quando você escreve:
int main(int argc, char** argv)
argv[0]
contém o nome do executável chamado. Pelo menos, esse é o comportamento padrão de todos os shells, e todos os executáveis que usam argumentos devem estar cientes disso.
Exemplo em Perl
Aqui está um exemplo artificial que eu montei no Perl, que mostra a técnica também.
Aqui está o script real, chame-o 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;
Aqui está a configuração do sistema de arquivos:
$ 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
Agora, quando eu executo meus 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-)