使用popen时找不到命令

时间:2016-06-07 17:49:49

标签: c linux system-calls popen

我在C工作,在使用以下参数调用popen时遇到问题:

void exampleFunction(void)
{
    .
    .
    .
    FILE* in = popen("alias -p", "r");
    .
    .
    .
}

当我以这种方式致电popen时,我收到以下消息:

alias: -p not found

我不知道实际上是什么问题,因为当我使用以下参数调用popen时:

FILE* in = popen("ls -i", "r");

没有问题,我使用相同的语法。

也许有人意识到实际上是错的。

2 个答案:

答案 0 :(得分:3)

alias命令内置于shell中。

popensystem()一样,调用/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同时存在,与内置和程序一样。