実行権限と...引数付きのシンボリックリンク?

実行権限と...引数付きのシンボリックリンク?

私は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:~$

出力は妥当です。明らかに、エラーは 2 回目の実行で発生します。これは、ラップトップに IPv6 ネットワークが設定されていないためです。しかし、出力は、ping4と がping6システム内で 2 つの異なるものであることを証明しています。しかし、これらは実際には何なのでしょうか? これらは両方とも にあります/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$

ここでは明らかに同じ実行可能ファイル (リンクなどなし) を使用しており、唯一の違いはその名前です。

関連情報