Arch Linuxでls -l
実行すると、およびがシンボリックリンクであることが/sbin
わかります。ただし、コマンドを実行することがすべて同じ動作を持つわけではありません。reboot
shutdown
poweroff
/usr/bin/systemctl
reboot
shutdown
systemctl
ls -l
シンボリックリンクに関する完全な情報は表示されませんか?たとえば、実際のシンボリックリンクが何であるかをどうやって知ることができますかreboot
?
答え1
多くのプログラムが実行方法に応じて動作を変更する実行可能ファイルを持つこの技術を使用します。
プログラムの内部には通常、呼び出し実行可能ファイルの名前を決定し、その実行可能ファイル名に適した関数を呼び出す case/switch ステートメントと呼ばれる構造があります。この名前は通常、プログラムが受け取る最初の引数です。たとえば、次のようにC
書くとき:
int main(int argc, char** argv)
argv[0]
呼び出される実行可能ファイルの名前を含みます。少なくともこれはすべてのシェルの標準的な動作であり、引数を使用するすべての実行可能ファイルはそれを知っている必要があります。
Perlの例
以下は、私がPerlで書いた技術を示す人工的な例です。
これは実際のスクリプトで、次のように呼び出されますmycmd.pl
。
#!/usr/bin/perl
use feature ':5.10';
(my $arg = $0) =~ s#./##;
my $msg = "I was called as: ";
given ($arg) {
$msg .= $arg when 'ls';
$msg .= $arg when 'find';
$msg .= $arg when 'pwd';
default { $msg = "Error: I don't know who I am 8-)"; }
}
say $msg;
exit 0;
ファイルシステムの設定は次のとおりです。
$ ls -l
total 4
lrwxrwxrwx 1 saml saml 8 May 24 20:49 find -> mycmd.pl
lrwxrwxrwx 1 saml saml 8 May 24 20:34 ls -> mycmd.pl
-rwxrwxr-x 1 saml saml 275 May 24 20:49 mycmd.pl
lrwxrwxrwx 1 saml saml 8 May 24 20:49 pwd -> mycmd.pl
これでコマンドを実行すると、次のようになります。
$ ./find
I was called as: find
$ ./ls
I was called as: ls
$ ./pwd
I was called as: pwd
$ ./mycmd.pl
Error: I don't know who I am 8-)