Muitos programas fazem uso dessa técnica quando há um único executável que altera seu comportamento com base em como foi executado.
Normalmente, há 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 executável. Esse nome geralmente é o primeiro argumento que o programa recebe. Por exemplo, em 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 para 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 coloquei em Perl, que mostra a técnica também.
Este é o script real, chame-o de 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 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-)