【问题标题】:How to execute command line via input如何通过输入执行命令行
【发布时间】:2020-08-28 09:48:03
【问题描述】:

我读过thisthis,但没有成功。

这是我的脚本:

env -i MY_KEY=$my_key MY_ACCOUNT=$my_account command-that-outputs-a-list \
    | grep "name" | awk -v src=$src \
    '{a = substr($2,2, length($2)-3); print "my_copy_cmd -s xx-yy/"src"/"a" -d . "}'

它会输出如下内容:

my_copy_cmd -s xx-yy/source-file-name -d .
my_copy_cmd -s xx-yy/source-file-name -d .
my_copy_cmd -s xx-yy/source-file-name -d .
my_copy_cmd -s xx-yy/source-file-name -d .

现在我只想在同一行执行它,但是xargs 使 all 传入一行参数(并且它不运行它)。 xargs -0 也不起作用。而且我想使用env -i 在没有变量的环境中运行它,并临时设置我的环境变量(= 就像我在第一个命令中所做的那样),类似于 (工作):

env -i MY_KEY=$my_key MY_ACCOUNT=$my_account command-that-outputs-a-list \
    | grep "name" | awk -v src=$src \
    '{a = substr($2,2, length($2)-3); print "my_copy_cmd -s xx-yy/"src"/"a" -d . "}' \
    | xargs env -i MY_KEY=$my_key MY_ACCOUNT=$my_account 

【问题讨论】:

    标签: linux shell


    【解决方案1】:

    这行得通吗:

    env -i MY_KEY=$my_key MY_ACCOUNT=$my_account command-that-outputs-a-list \
        | grep "name" | awk -v src=$src \
        '{a = substr($2,2, length($2)-3); print "my_copy_cmd -s xx-yy/"src"/"a" -d . "}'|while read z;do $z 2>&1 ;done
    

    while loop 将从输出中读取每一整行,然后执行它。

    【讨论】:

    • 只执行一次 = 第一行
    • 如果您尝试使用|while read z;do echo $z;done 进行调试,它会再次给您所有的行吗?如果是这样,那么我会假设您第一次执行 my_copy_cmd 时出现错误,这会以某种方式阻止其余的复制命令运行.. 或者在整个命令运行后立即使用 echo $? 来查看是否结果是0
    • 是的,它再次给了我所有“转换后的行”(准备执行!),echo $? 的结果是 0
    • 如果echo $z 给出了正确的输出,这与您在上面看到的相同,那么while 循环会正确解析每一行.. 现在为什么您的my_copy_cmd 没有执行,我没有足够的细节可以说。如果您在 shell 中手动执行 my_copy_cmd 是否有效?所有参数?和之后的echo $? 又是0 ?
    • 这很奇怪:如果我逐行复制/粘贴它们会起作用,但是如果我复制整行然后将它们粘贴到 shell 中,则只会执行第一个。仅供参考,它正在 Linux 下启动 az(azure 命令实用程序)
    【解决方案2】:

    尝试将输出通过管道传输到shbash。您可以通过在命令前添加赋值来设置变量:

    $ echo 'echo variable is $my_var' | my_var=foo bash
    variable is foo
    

    所以这样的事情应该可以工作:

    env -i MY_KEY=$my_key MY_ACCOUNT=$my_account command-that-outputs-a-list \
        | grep "name" | awk -v src=$src \
        '{a = substr($2,2, length($2)-3); print "my_copy_cmd -s xx-yy/"src"/"a" -d . "}' \
        | MY_KEY=$my_key MY_ACCOUNT=$my_account bash
    

    我发现这是一个非常好的技巧,可以在实际执行之前组装和预览一批命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 2018-11-09
      • 2011-08-20
      • 2011-05-08
      相关资源
      最近更新 更多