2016-12-02 84 views
0

通常,argv [0]与exec文件名相同。例如:PATH env和argv之间的关系[0]

  • 如果我执行程序与./my_program然后argv[0]./my_program
  • 如果我执行程序与/home/username/my_program然后argv[0]/home/username/my_program

我的问题是,如果PATH=/home/username为什么我看不到argv[0]值?

这是我的真实情况

PATH=/home/knight/bin:/home/knight/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/knight 

我的测试程序源:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
     printf("%s\n", argv[0]); 
} 

我的主目录是/home/knight这样我就可以直接执行程序。

[email protected]:~$ test 

[email protected]:~$ ./test 
./test 

我不明白,为什么[email protected]:~$ test命令不打印任何结果?

+5

'test'是[bash的关键字(http://wiki.bash-hackers.org/commands/classictest),这样你就不会实际运行可执行文件时你只需在命令提示符下键入'test'。 –

+1

@ PaulR的观察是否使您的整个问题无关紧要,还是您想知道其他*程序名称的行为? – usr2564301

+0

在类UNIX系统上,环境变量通过传统上称为env或argen的指针传入。 main有签名int main(int argc,char ** argv,char ** argenv)。不能移植到非UNIX当然 –

回答

3

因为test是shell内置命令。

而且还有./test之间有很大的差别(这是一个可执行文件),而test是一个命令传递直接到的,如果输入不正确的外壳,它可能已经不承认比如可以说你使用命令tst结果将是-bash: tst: command not found

要检查是否有任何字是shell的内置命令/保留关键字,请使用命令type

对终端

$type test 
test is a shell builtin 
$type if 
if is a shell keyword 
相关问题