Unix 重命名可执行文件会更改行为

Unix 重命名可执行文件会更改行为,unix,Unix,我不知道这个问题是否真的适合这个论坛,它很可能不适合,但我们还是来了 在unix程序上运行无效命令后;我得到了熟悉的 Usage: PROGRAM [OPTION]... [FILE]... 当我正在审查一个项目时,我突然想到了一个想法。也就是说,C++程序可以很容易地实现,以基于可执行文件的名称来改变行为(即,在代码 ARGV )。 我完全不知道为什么这会有用,我知道argv[0]是有用的,但是有人见过这样做的程序(更改名称时的行为)并通过这样做实现了什么吗?是的,这是例行程序(但很好地实现

我不知道这个问题是否真的适合这个论坛,它很可能不适合,但我们还是来了

在unix程序上运行无效命令后;我得到了熟悉的

Usage: PROGRAM [OPTION]... [FILE]...
当我正在审查一个项目时,我突然想到了一个想法。也就是说,C++程序可以很容易地实现,以基于可执行文件的名称来改变行为(即,在代码<第一个参数> ARGV )。 我完全不知道为什么这会有用,我知道
argv[0]
是有用的,但是有人见过这样做的程序(更改名称时的行为)并通过这样做实现了什么吗?

是的,这是例行程序(但很好地实现了这一点)。例如:

$ (cd /usr/bin; ls -li | grep -w vim)
 2704450 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 ex -> vim
 2704451 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 rview -> vim
 2704452 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 rvim -> vim
 2378579 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 vi -> vim
 2704453 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 view -> vim
 2343880 -rwxr-xr-x   1 root      wheel   1472736 Oct 31  2013 vim
 2704454 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 vimdiff -> vim
$
因此,
vim
可执行文件也可以作为
vimdiff
view
vi
ex
调用,其行为将根据调用方式而有所不同。在某些系统上,这些将是硬链接而不是符号链接(数据来自Mac OS X 10.9.2 Mavericks),因此您需要
grep
获取inode编号,而不是
vim

另一个例子:

$ (cd /usr/bin; ls -li | grep -w vim)
 2704450 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 ex -> vim
 2704451 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 rview -> vim
 2704452 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 rvim -> vim
 2378579 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 vi -> vim
 2704453 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 view -> vim
 2343880 -rwxr-xr-x   1 root      wheel   1472736 Oct 31  2013 vim
 2704454 lrwxr-xr-x   1 root      wheel         3 Oct 31  2013 vimdiff -> vim
$
作为
Bash
调用时,Bash的操作与作为
sh
调用时不同。通常,Shell在名称前面用破折号(
-sh
-bash
,等等)调用时会识别,并在执行此操作时充当登录Shell:

$ ps
  PID TTY           TIME CMD
39301 ttys000    0:01.30 -bash
46766 ttys001    0:00.24 -bash
$

哇,太好了;我不知道它有实际应用。像busybox这样的应用程序也是这样实现的吗我的想法是,这些东西是通过。传递给可执行文件的隐藏命令,但显然不是;我猜它是这样工作的,但我不确定。我有一个程序,
sqlcmd
(微软的强尼最近来了十年或更长时间!),它有链接
sqlunload
sqlreload
,根据使用的名称,它的行为会有所不同(尽管您也可以使用
-U
选项将其驱动到“卸载”模式,使用
-R
选项将其驱动到“重新加载”模式)。甚至在
vim
之前,vi就是line editor ex的可视模式,是同一个可执行文件的硬链接。@rojomoke:同意,但在现代系统上很难提供这种旧行为的证据。这种技术有着悠久的历史。如果你能找到Unix SVR4手册,你会发现
ed
也可以作为
调用>red
(受限编辑器);
sh
也可以作为
rsh
(受限-非远程-shell)或
jsh
(作业shell)调用;
ksh
也可以作为
rksh
调用(受限Korn shell)。您也可以更改它。然后ps显示新名称!有趣,但不太有用。这是标准允许的吗?