8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

执行包括管道在内的变量的内容

Valery S. 1月前

24 0

#!/bin/bash# 第一部分 ret=$(ps aux | grep -v grep) # 没问题 echo $ret# 第二部分 cmd=\'ps aux | grep -v grep\' # 管道有问题 | ret=$($cmd) echo $retHow ...

#!/bin/bash

# 1st part
ret=$(ps aux | grep -v grep)    # thats OK 
echo $ret

# 2nd part
cmd="ps aux | grep -v grep"     # a problem with the pipe | 
ret=$($cmd)         
echo $ret

我怎样才能像在第二部分中那样使用命令字符串?我认为管道是问题所在。尝试过逃避它,但没有帮助。得到一些 ps 的 snytax 错误。

帖子版权声明 1、本帖标题:执行包括管道在内的变量的内容
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Valery S.在本站《bash》版块原创发布, 转载请注明出处!
最新回复 (0)
  • D.B. 1月前 0 只看Ta
    引用 2

    这里不建议 eval 使用 BashFAQ/048 - Eval 命令和安全问题 .

    您可以通过定义和调用下面的函数以简单的方式解决此问题

    ps_cmd() {
        ps aux | grep -v grep
    }
    

    并在脚本中使用它作为

    output="$(ps_cmd)"
    echo "$output"
    

    另外,值得一读的是,看看为什么将命令存储在变量中不是一个好主意,并且有很多潜在的陷阱 - BashFAQ/050 - 我试图将命令放入变量中,但复杂的情况总是失败!

  • 你需要 eval

    ret=$(eval "$cmd")
    
  • 请注意,在嵌套的 eval 中正确使用引号和反斜杠相当困难;并且如果字符串的部分来自用户,使用 eval 是极其不安全的。

  • 感谢您提供实际有效的答案!现在,如果你能解释为什么你不能只做 ret=eval $cmd

  • @AlRo,首先:ret=eval $cmd 运行 $cmd,并将 ret 临时设置为字符串 eval,由于 eval 是数据而不是命令,因此调用 $cmd 容易受到 BashFAQ #50 中的错误的影响。其次:如果您不引用 \'$cmd\',则其内容会被拆分成单词并进行全局扩展,然后再粘贴回单个字符串并传递给 eval。这究竟如何破坏您的命令取决于命令的详细信息以及您当前工作目录中的文件,但基本上不会有什么好处。

返回
作者最近主题: