【问题标题】:How can I pipe a string that the user input?如何通过管道传输用户输入的字符串?
【发布时间】:2015-03-20 21:32:53
【问题描述】:

我需要通过管道传输一个已拆分为单独参数的字符串。例如,

cd foo | cat bar.txt

已被解析并存储到数组中

char *arr[];
arr = {"cd", "foo", "|", "cat", "bar.txt"}

我最初的想法是遍历数组,直到我看到管道并将命令存储到另一个数组中然后运行它。还有其他方法可以解决这个问题吗?

【问题讨论】:

  • 看看sprintf。形成你的字符串是微不足道的。
  • 使用原字符串:system("cd foo | cat bar.txt");或系统(字符串名称);
  • 不允许使用system()
  • 您可以放置​​一个空指针来代替| 字符串,并在最后放置另一个空指针,然后材料(或多或少)适合传递给execvp()。当然cd 命令需要一些特殊处理并且通常不会生成任何输出——并且在管道的 LHS 上,无论如何都不会影响父进程,所以也许你不需要特殊处理在这种情况下。 cat 无论如何都会忽略其标准输入,因为它被赋予了要列出的文件名。
  • cd foo | cat bar.txt 不是有效的管道命令。但我认为您可能想做类似cat bar.txt | grep TEXT 的事情。为此,您需要为每个命令使用fork(2),将它们的STDIN_FILENOSTDOUT_FILENO 相互重定向到具有dup2(2)pipe(2) 的管道。然后为每个命令运行 exec(2) 系列中的任何函数。

标签: c shell unix


【解决方案1】:

你可以使用 awk :

str="cd foo | cat bar.txt"

command_first=echo $str | awk -F "|" '{print $1}'

command_second=echo $str | awk -F "|" '{print $2}'

评估 $command_first

评估 $command_second

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2014-02-03
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多