Answers:
许多程序使用这种技术,其中只有一个可执行文件会根据其执行方式更改其行为。
程序内部通常有一个称为case / switch语句的结构,该结构确定调用可执行文件的名称,然后将为该可执行文件名称调用适当的功能。该名称通常是程序接收的第一个参数。例如,在C
您编写时:
int main(int argc, char** argv)
argv[0]
包含被调用可执行文件的名称。至少,这是所有shell的标准行为,所有使用参数的可执行文件都应意识到这一点。
这是我在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-)
ssh-argv0
main
是相反的。argc
来过argv
。