
저는 Ubuntu 20.04를 기반으로 하는 Linux Mint 20.1을 사용하고 있습니다. 내 커널은 5.4.0-60-generic
. 아래의 모든 명령은 다음에서 실행됩니다.GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
다른 명령에서도 동일한 동작을 보았지만 ping
여기서는 예로 사용하겠습니다. 다음 명령을 실행하면 어떤 일이 발생하는지 살펴보겠습니다.
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:~$
출력은 합리적입니다. 내 랩톱에 IPv6 네트워크가 구성되어 있지 않기 때문에 분명히 두 번째 실행에서 오류가 발생합니다. 그러나 출력은 내 시스템에서 두 가지 다른 것임을 ping4
증명 합니다. ping6
하지만 실제로는 무엇입니까? 둘 다 다음 위치에 있습니다 /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:~$
그리고 이 파일들은 실제로 무엇입니까?
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:~$
우와! 둘 다 동일한 실행 파일에 대한 심볼릭 링크입니다 /usr/bin/ping
! 그런데 그게 어떻게 가능합니까? 심볼릭 링크에 실행 인수를 추가하는 마법 같은 방법이 있나요?
답변1
알고 보니아니요, 불가능합니다실행 명령줄 인수에 영향을 미치는 심볼릭 링크를 만듭니다. 그러면 어떻게 작동합니까 ping
? 분명히 유틸리티를 실행하는 데 어떤 파일을 사용하고 있는지 알아내는 데 ping
사용됩니다 . argv[0]
파일 이름에만 관심이 있습니다. 쉽게 확인할 수 있는 방법은 다음과 같습니다.
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$
여기서 우리는 분명히 동일한 실행 파일(링크 등 없음)을 사용하고 있으며 유일한 차이점은 이름입니다.