【问题标题】:bash: separating command from pipebash:从管道中分离命令
【发布时间】:2017-11-25 19:35:44
【问题描述】:

我有一个接受命令行参数的第三方软件。我想将输出通过管道传输到文件中。我发现如果我尝试,由于某些莫名其妙的原因,代码会挂起:

./run_third_part.py &> log

但如果

./run_third_part.py

我相信管道输出会扰乱读取命令行参数的过程,尽管欢迎其他想法。如何将程序与管道命令隔离开来? (我在考虑放某种括号。)

【问题讨论】:

  • 这个程序是否从输入中读取任何内容?
  • 可以,但也可以不输入
  • 你说“接受命令行参数”。你在哪里指定这些?
  • 可以,但它们是可选的

标签: bash shell command-line pipe command-line-arguments


【解决方案1】:

你可以尝试创建一个子shell并运行脚本吗?

bash$ `./run_third_part.py` &> log

请注意`不是' (单引号)

【讨论】:

  • 不要。这个答案是错误的,并且 - 取决于 run_third_part.py 的输出 - 可能很危险。
  • 我在本地系统中尝试过类似的场景并进行了验证,得出的结论是在子shell中运行它并将整个内容记录在日志中也可以工作。请解释它有多危险,
  • 所以,尝试运行一个命令:`echo ls`。然后备份当前目录并将ls替换为rm *
  • 在子shell中命令将执行,现在与在子shell中调用脚本有什么关系。
  • 因为反引号不适用于在子 shell 中运行命令。是的,他们这样做,作为副作用echo rm * 是完全无害的命令。你可以在你的 shell 中安全地运行它。但是,将其放在反引号中,您将丢失数据。不信就试试。或者,最好仔细阅读文档。
【解决方案2】:

可能脚本正在等待交互式提示的输入。解决这个问题的最简单方法通常是给它一些输入:

./run_third_part.py < /dev/null &> log

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2017-12-04
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多