
Estoy usando Linux Mint 20.1, que está basado en Ubuntu 20.04. Mi núcleo es 5.4.0-60-generic
. Todos los comandos siguientes se ejecutan enGNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
He visto el mismo comportamiento con algunos otros comandos, pero lo usaré ping
aquí como ejemplo. Veamos qué sucede si ejecuto los siguientes 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:~$
El resultado es razonable. El error, obviamente, ocurre en la segunda ejecución, porque no tengo una red IPv6 configurada en mi computadora portátil. Pero el resultado lo demuestra ping4
y ping6
son dos cosas diferentes en mi sistema. ¿Pero qué son en realidad? Ambos están ubicados en /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:~$
¿Y qué son realmente estos archivos?
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:~$
¡Guau! ¡Ambos son enlaces simbólicos al mismo ejecutable /usr/bin/ping
! ¿Pero cómo es eso posible? ¿Existe alguna forma mágica de hacer que un enlace simbólico agregue argumentos de ejecución?
Respuesta1
Resulta queNo, no es posiblepara crear un enlace simbólico que afecta los argumentos de la línea de comando de ejecución. ¿Pero cómo funciona ping
entonces? Aparentemente, ping
se utiliza argv[0]
para averiguar qué archivo estamos usando para ejecutar la utilidad. Sólo le preocupa el nombre del archivo. Así es como puedes comprobarlo fácilmente:
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$
Aquí obviamente estamos usando el mismo ejecutable (sin enlace o algo así), y la única diferencia es su nombre.