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