【问题标题】:How do you use braces with execlp()?如何在 execlp() 中使用大括号?
【发布时间】:2015-01-02 09:09:46
【问题描述】:

当我使用execlp("ls", "ls", "-al", NULL) 时,我的程序可以工作,但当我使用execlp("{", "{", "ls", "-al", "}", NULL) 时,它就无法工作

有没有办法在execlp() 中使用大括号?

【问题讨论】:

    标签: c exec parentheses


    【解决方案1】:

    基本上,答案是否定的。

    execlp("{", "{", "ls", "-al", "}", NULL)
    

    您正在尝试执行名为 { 的命令。 { 不是命令;它是 shell 语法的一部分,execlp(不像system)不通过 shell 执行它的命令。命令名称必须是实际可执行文件(二进制或 shell 脚本)。

    如果你真的想这样做,你可以调用/bin/sh 作为命令,并传递命令行参数,然后它将执行。例如(我没有测试过这个):

    execlp("/bin/sh", "/bin/sh", "-c", "{ ls -al; }", NULL);
    

    请注意,整个命令是一个字符串,/bin/sh 将一个参数视为-c 选项的一个参数。 (shell 本身会将其拆分为单词。)

    【讨论】:

    • 请注意,在这种情况下,大括号没有任何好处。在 shell 脚本中,它们提供了一个用于 I/O 重定向的单元,但这里嵌入的 shell 脚本不包含 I/O 重定向。
    • 另外(只是为了好玩),请注意execlp("[", "[", "ls", "-gt", ".", "]", NULL); 可能会工作,甚至可能成功(但不会产生任何输出)。但那是因为通常有一个二进制 /bin/[/usr/bin/[execlp() 执行。
    • 哇,我不知道 /bin 或 /usr/bin 中的“[”。这是关于什么的?
    • @JonathanLeffler:对于这种特殊情况,是的,我假设这是一个简化的示例。 (尽管 OP 试图做的任何事情都可以通过编写和调用 shell 脚本而不是在内存中构造 shell 语法来更容易地完成。)
    • @CharlieBurns:[ 是一个命令,几乎等同于test。与{ 不同,它不是内置的shell 语法。 info bashinfo test 了解更多信息。
    猜你喜欢
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2023-03-13
    • 2020-07-20
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多