代码之家  ›  专栏  ›  技术社区  ›  stacker

如何从变量运行脚本命令?

  •  8
  • stacker  · 技术社区  · 14 年前

    基本 :

    single="ls -l"
    $single
    

    一切正常

    :

    multi="ls -l | grep e"
    $multi
    ls: |: No such file or directory
    ls: grep: No such file or directory
    ls: e: No such file or directory
    

    …不奇怪

    bash < $multi
    
    $multi: ambiguous redirect
    

    下一次尝试

    bash $multi
    /bin/ls: /bin/ls: cannot execute binary file
    

    仅限

    echo $multi > tmp.sh
    bash tmp.sh
    

    有没有一种方法可以在不创建脚本的情况下执行更复杂的命令?

    3 回复  |  直到 14 年前
        1
  •  15
  •   bukzor    14 年前

    您正在演示shell和内核之间的区别。

    “ls-l”可由system execve()调用执行。你可以 man execve

    “ls-l | grep e”需要shell解释来设置管道。在不使用shell的情况下,“|”字符只是作为ls的参数传入execve()。这就是为什么您会看到“没有这样的文件或目录”错误。

    cmd="ls -l | grep e"
    bash -c "$cmd"
    
        2
  •  0
  •   Community rcollyer    7 年前

    你需要一个 heredoc 要正确地做到这一点。回应 POSIX compliant way to see if a function is defined in an sh script

    % multi='ls -l | grep e'
    % sh <<_EOF_
    > ${multi}
    > _EOF_
    < desired output >
    

    这就解决了你的简单例子。更多信息,请参阅我的其他答案。

    -迈克

        3
  •  -3
  •   ghostdog74    14 年前

    ls -l |grep

    如果要捕获输出,请使用$()

    var=$(ls -l |grep .. )