Por que os links simbólicos de reinicialização, desligamento e poweroff para systemctl?

28

Em Arch Linux, se eu fizer ls -lem /sbin, eu posso ver que reboot, shutdowne poweroffsão todos links simbólicos para /usr/bin/systemctl. Mas a emissão reboot, shutdowne systemctlcomandos, obviamente, não têm o mesmo comportamento.

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

Gradiente
fonte
1
Para mais informações, consulte unix.stackexchange.com/a/196014/5132 .
9118 JdeBP

Respostas:

42

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, Cquando 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-)
slm
fonte
Veja também:ssh-argv0
jordanm
4
É assim que o BusyBox funciona. Ele possui um único binário que atua como a maioria dos utilitários comuns do GNU.
Fake Name
1
Os argumentos para o mainsão revertidos. argcvem antes argv.
Bakuriu 25/05
4
em C, você não pode fazer uma declaração de troca com seqüências de caracteres.
BatchyX 25/05
3
+1 para "Eu não sei quem eu sou" :)
um CVn