【问题标题】:Redirecting standard input / output to substituted command将标准输入/输出重定向到替代命令
【发布时间】:2017-03-31 01:37:26
【问题描述】:

我正在尝试运行一个命令,可以简化成这样的结构:

echo "A,B" | cp $(sed -e 's/A,//') $(sed -e 's/,B//') 

但我正在努力正确地获取替换命令的输入/输出。 运行上面的代码会产生以下错误消息: sed:标准输入读取错误:输入/输出错误

当我改为运行它时:

echo "A,B" | cp <(sed -e 's/A,//') <(sed -e 's/,B//') 

命令不会终止。

我在这里做错了什么?

【问题讨论】:

    标签: linux terminal pipe zsh io-redirection


    【解决方案1】:

    sed 的两个实例都在等待其标准输入(即您的终端)上的输入。管道连接到cp 的标准输入,而不是任何一个sed 实例。

    试试这个:

    read first second <<< "A,B"
    cp "${first}" "${second}"
    

    或者,或者:

    var="A,B"
    cp "${var%,*}" "${var#*,}"
    

    【讨论】:

    • 我想要的是一个单行程序,执行以下工作:获取一个命令的输出,以多种不同的方式处理它,并将结果用作另一个命令的输入参数。看起来sed 实际上正在获取输入,如:echo "123" | echo &lt;$(sed -e 's/2/4/') 返回:zsh:没有这样的文件或目录:143
    • 两个进程替换都从运行cp 的shell 继承它们的标准输入,因此cp 的所有三个和sed 的两个都将从管道中读取。 cp 忽略标准输入,因此由操作系统决定 sed 被安排首先运行并能够读取传入的字符串。
    【解决方案2】:

    试试这个:

    echo "A,B" | (IN=$(cat); cp $(echo $IN | sed -e 's/A,//') $(echo $IN | sed -e 's/,B//'))
    

    这将创建一个子 shell 并将 stdin 输入保存到 $IN 变量。然后它在输入上运行 2 个sed 命令,并将输出用作cp 的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 2014-02-02
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多