
我使用的是 Linux Mint 20.1,它是基於 Ubuntu 20.04。我的內核是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$
在這裡,我們顯然使用相同的可執行檔(沒有連結或類似的東西),唯一的區別是它的名稱。