我在C工作,在使用以下参数调用popen时遇到问题:
void exampleFunction(void)
{
.
.
.
FILE* in = popen("alias -p", "r");
.
.
.
}
当我以这种方式致电popen
时,我收到以下消息:
alias: -p not found
我不知道实际上是什么问题,因为当我使用以下参数调用popen
时:
FILE* in = popen("ls -i", "r");
没有问题,我使用相同的语法。
也许有人意识到实际上是错的。
答案 0 :(得分:3)
alias
命令内置于shell中。
popen
与system()
一样,调用/bin/sh
来执行指定的命令。您的交互式shell可能是bash,它支持-p
的{{1}}选项。 alias
,取决于您的系统配置,可能不会。
在任何情况下,即使这样,它也不会给你任何有用的信息。 /bin/sh
调用将调用一个新的shell,并且(再次,取决于您的配置),它可能不会设置您的别名,因为它不是交互式shell。
popen()
命令有效,因为ls -i
是一个外部命令,因此无论是从ls
还是bash
调用,它的工作方式都相同,或者来自交互式或非交互式shell。 (有时/bin/sh
可以定义为别名或shell函数,但此类定义通常不会干扰ls
选项的使用。)
答案 1 :(得分:1)
alias
不是可执行程序,而是内置shell(将其视为“bash脚本语言中的函数”),因此您无法通过此名称打开进程。你可以尝试欺骗bash并将其传入。像这个未经测试的片段:
FILE* p = popen("/bin/bash", "r"); // Note: on non-Linux-systems you might need another path or rely on $PATH
fprintf(p, "alias -p\n");
请注意,您也无法直接调用别名。
与ls
的区别在于ls
同时存在,与内置和程序一样。