Por que os links simbólicos reboot, shutdown e poweroff para systemctl?

28

No Arch Linux, se eu fizer ls -l in /sbin , será possível ver que reboot , shutdown e poweroff são todos links simbólicos para /usr/bin/systemctl . Mas a emissão de comandos reboot , shutdown e systemctl obviamente nem todos tem o mesmo comportamento.

ls -l não está me mostrando informações completas sobre links simbólicos? Como posso, por exemplo, saber qual é o verdadeiro link simbólico de reboot ?

    
por Gradient 25.05.2013 / 01:29

1 resposta

41

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-)
    
por 25.05.2013 / 01:40