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

时间:2014-05-13 12:49:58

标签: unix

我不知道这个问题是否真的适合这个论坛,可能不是,但不过我们走了;

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

Usage: PROGRAM [OPTION]... [FILE]...

当我正在审查一个程序的过程中,当我这样做的时候,脑子里浮现出一种想法。即可以轻松实现C ++程序,以根据可执行文件的名称(即argv中的第一个参数)更改行为。

我完全不知道为什么这会有用,我知道argv[0]可能很有用,但是有没有人见过一个程序,它做了这个(改变名字改变的行为)并通过做所以?

1 个答案:

答案 0 :(得分:3)

是的,这是常规的(但是为了意识到可以做到这一点做得很好)。例如:

$ (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可执行文件也可以作为vimdiffviewviex调用,它的行为会有所不同,具体取决于它是怎样的调用。在某些系统上,这些将是硬链接而不是符号链接(数据来自Mac OS X 10.9.2 Mavericks),因此您需要grep来获取inode号而不是vim。< / p>

另一个例子:

bash调用时相比,调用sh时Bash的运行方式不同。传统上,shell在其名称(--sh等)前面使用短划线-bash进行调用时会识别,并在您执行此操作时充当登录shell:

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