Em Arch Linux, se eu fizer ls -l
em /sbin
, eu posso ver que reboot
, shutdown
e poweroff
são todos links simbólicos para /usr/bin/systemctl
. Mas a emissão reboot
, shutdown
e systemctl
comandos, obviamente, não têm o mesmo comportamento.
Não ls -l
está me mostrando informações completas sobre links simbólicos? Como posso, por exemplo, saber qual é o verdadeiro link simbólico reboot
?
Respostas:
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: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
:Aqui está a configuração do sistema de arquivos:
Agora, quando eu executo meus comandos:
fonte
ssh-argv0
main
são revertidos.argc
vem antesargv
.