
Estou usando o Linux Mint 20.1, que é baseado no Ubuntu 20.04. Meu kernel é 5.4.0-60-generic
. Todos os comandos abaixo são executados emGNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Já vi o mesmo comportamento com alguns outros comandos, mas usarei ping
como exemplo aqui. Vamos ver o que acontece se eu executar os seguintes comandos:
nikolay@KoLin:~$ ping4 -c1 google.com
PING google.com (108.177.14.139) 56(84) bytes of data.
64 bytes from lt-in-f139.1e100.net (108.177.14.139): icmp_seq=1 ttl=107 time=41.3 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 41.301/41.301/41.301/0.000 ms
nikolay@KoLin:~$ ping6 -c1 google.com
ping6: connect: Network is unreachable
nikolay@KoLin:~$
A saída é razoável. O erro, obviamente, ocorre na segunda execução, pois não tenho uma rede IPv6 configurada no meu laptop. Mas a saída prova isso ping4
e ping6
são duas coisas diferentes no meu sistema. Mas o que são eles na verdade? Ambos estão localizados em /usr/bin
:
nikolay@KoLin:~$ whereis ping{4,6}
ping4: /usr/bin/ping4 /usr/share/man/man8/ping4.8.gz
ping6: /usr/bin/ping6 /usr/share/man/man8/ping6.8.gz
nikolay@KoLin:~$
E o que são esses arquivos realmente?
nikolay@KoLin:~$ ls -l /usr/bin/ping*
-rwxr-xr-x 1 root root 72776 Jan 31 2020 /usr/bin/ping
lrwxrwxrwx 1 root root 4 Jan 11 21:00 /usr/bin/ping4 -> ping
lrwxrwxrwx 1 root root 4 Jan 11 21:00 /usr/bin/ping6 -> ping
nikolay@KoLin:~$
Uau! Ambos são links simbólicos para o mesmo executável /usr/bin/ping
! Mas como isso é possível? Existe alguma maneira mágica de fazer com que o link simbólico adicione argumentos de execução?
Responder1
Acontece queNão, não é possívelpara criar um link simbólico que afeta os argumentos da linha de comando de execução. Mas como isso funciona ping
então? Aparentemente, ping
usamos argv[0]
para descobrir qual arquivo estamos usando para executar o utilitário. Ele está preocupado apenas com o nome do arquivo. Veja como você pode verificar isso facilmente:
nikolay@KoLin:~/Desktop$ cp /usr/bin/ping ./ping4
nikolay@KoLin:~/Desktop$ ./ping4 -c1 google.com
PING google.com (64.233.164.113) 56(84) bytes of data.
64 bytes from lf-in-f113.1e100.net (64.233.164.113): icmp_seq=1 ttl=107 time=19.2 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 19.152/19.152/19.152/0.000 ms
nikolay@KoLin:~/Desktop$ mv ping4 ping6
nikolay@KoLin:~/Desktop$ ./ping6 -c1 google.com
./ping6: connect: Network is unreachable
nikolay@KoLin:~/Desktop$
Aqui obviamente estamos usando o mesmo executável (sem link ou algo parecido), e a única diferença é o nome.