【问题标题】:Running command using XARG使用 XARGS 运行命令
【发布时间】:2012-01-02 06:45:02
【问题描述】:

我有示例文件:test_file

//--- Test File--
**RUN_THIS
RUN_THIS00
RUN_THIS01
DONT_RUN00
DONT_RUN00
RUN_THIS02**

RUN_THIS* & DONT_RUN* 是命令。 我想只从 test_file 运行 RUN_THIS 命令而不编辑文件。 我正在寻找类似的选项

cat test_file | grep RUN_THIS | xargs  {Some option to be provided to run run_this}

我无法启动新的 shell

【问题讨论】:

    标签: command-line sh xargs


    【解决方案1】:

    大概是这样的吧?

    for cmd in $(grep RUN_THIS < test_file); do
        $cmd --some-option-to-be-provided-to-run-this
    done
    

    只要test_file 中的命令中没有空格,这应该可以正常工作。

    【讨论】:

      【解决方案2】:
      eval `grep RUN_THIS test_file`
      

      还要注意避免无用的 Cat。

      实际上,您可能需要在test_file 中的每个命令末尾添加分号,或者将grep 更改为添加必要分号的内容。

      eval `awk '/RUN_THIS/ { print; print ";" }'`
      

      我不确定我是否理解不启动新 shell 的要求。在幕后,反引号运行一个子shell,因此这可能违反该要求(但最终每个外部命令都会启动一个新进程,当您运行shell脚本时,该进程作为当前shell进程的一个分支开始)。如果您害怕安全隐患,那么无论如何,您一开始就不应该使用 shell 脚本。

      【讨论】:

      • 哦,如果合适的话,也许你应该编辑标题,因为这不是关于xargs
      • eval 不太推荐。
      【解决方案3】:

      要运行新的 shell,您需要在命令中加入“ksh”。

      最简单的形式

      RUN_THIS00='ls'
      echo $RUN_THIS00 | ksh
      

      【讨论】:

      • OP明确表示他无法启动shell。
      • 当然可以使用 exec,但你确定它“不想”启动新的 shell 还是“不能”因为不工作。
      • @triplee 鉴于您在这里做出了自己的承诺,因此将别人的答案降级似乎是错误的,尤其是因为您已经代表问题假设了一些事情……重新考虑是为了。
      • 我对你的回答的另一个疑问是 ksh 的无用使用,而普通的 Ole sh 会做得很好。我已经提交了您问题的编辑版本;如果它获得批准,我可以并且将改变我的投票。对不起,如果我在这里打破了礼仪;我在谷歌上搜索了一下,但无法提出反对否决“竞争”答案的权威建议;但我当然应该留下评论来解释这一点。
      • 看来我的编辑没有被接受。反正基本就是grep RUN_THIS test_file | sh。也许您想自己编辑您的回复。
      猜你喜欢
      • 2011-10-20
      • 2022-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2023-03-17
      相关资源
      最近更新 更多