Todo programa pode ver a linha de comando completa que foi usada para executá-lo (exceto por curingas e variáveis, que o shell expande).
Em um programa C, a linha de comando é armazenada em argv
, que é a abreviação de vetor de argumento .
O nome do programa é o primeiro elemento de argv
, ou seja, argv[0]
.
Claramente, no caso de halt
e reboot
, o programa está alterando seu comportamento com base em argv[0]
.
Do bash, você pode ver a linha de comando completa usada para executar um programa usando ps -p <pid> -o cmd
ou cat /proc/<pid>/cmdline
.
Observe que há outro tipo de link chamado hard link que terá o mesmo efeito. No meu sistema, por exemplo, sudo
e sudoedit
são o mesmo arquivo com dois nomes diferentes e comportamentos diferentes.
ls -i
pode ajudar você a encontrar esses comandos, por exemplo:
$ ls -il | awk '$3 != 1 { print }'
total 156872
2491111 -rwsr-xr-x 2 root root 127560 2011-01-20 05:03 sudo
2491111 -rwsr-xr-x 2 root root 127560 2011-01-20 05:03 sudoedit
Veja man ln
para mais detalhes sobre hard links se você não estiver familiarizado com eles.