多くのプログラムは、実行方法に基づいて動作を変更する単一の実行可能ファイルがある場合、この手法を使用します。
通常、プログラム内には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-)