Arch Linuxでは、ls -l
で/sbin
を実行すると、reboot
、shutdown
およびpoweroff
がすべて/usr/bin/systemctl
へのシンボリックリンクであることがわかります。ただし、reboot
、shutdown
、およびsystemctl
コマンドを発行しても、すべての動作が同じになるわけではありません。
ls -l
にシンボリックリンクに関する完全な情報が表示されていませんか?たとえば、reboot
の本当のシンボリックリンクを知るにはどうすればよいですか?
多くのプログラムはこの手法を利用しており、実行方法に基づいて動作を変更する単一の実行可能ファイルがあります。
通常、プログラム内にはcase/switchステートメントと呼ばれる構造があり、実行可能ファイルの呼び出しに使用された名前を判別し、その実行可能ファイル名に適切な機能を呼び出します。その名前は通常、プログラムが受け取る最初の引数です。たとえば、C
では、次のように記述します。
int main(int argc, char** argv)
argv[0]
には、呼び出された実行可能ファイルの名前が含まれています。少なくとも、これはすべてのシェルの標準的な動作であり、引数を使用するすべての実行可能ファイルはこれに注意する必要があります。
これは、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-)