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

脚本中硬编码的执行命令在变量中不起作用

  •  0
  • johnnycrash  · 技术社区  · 14 年前

    这工作:

    nc shldvgfas005 6155 < temp.6153 
    

    这悬挂:

    cmd="nc shldvgfas005 6153 < temp.6153"; $cmd
    

    这会产生一个错误:

    cmd="nc shldvgfas005 6153 < temp.6153"; "$cmd"
    
    -bash: nc shldvgfas005 6153 <  temp.6153: command not found
    

    救命!

    2 回复  |  直到 10 年前
        1
  •  1
  •   JasonMArcher TWE    10 年前

    BASH常见问题解答 entry #50 :

    我试图在变量中放置一个命令,但是复杂的情况总是失败的!

    变量保存数据。函数保持代码。不要把代码放在变量中!在许多情况下,人们试图将命令或命令参数推送到变量中,然后运行它们。每个案件都需要单独处理。

        2
  •  1
  •   Chris Johnsen    14 年前

    这工作:

    nc shldvgfas005 6155 < temp.6153
    

    这悬挂:

    cmd="nc shldvgfas005 6153 < temp.6153"; $cmd
    

    您在这里看到的区别是,在参数扩展之前,shell解析重定向操作符。

    这会产生一个错误:

    cmd="nc shldvgfas005 6153 < temp.6153"; "$cmd"
    
    -bash: nc shldvgfas005 6153 <  temp.6153: command not found
    

    此命令失败,因为参数扩展周围的引号阻止将其拆分为多个字段。shell试图找到一个名为 nc shldvgfas005 6153 < temp.6153 (即文件名中有嵌入的空格),但找不到任何此类文件。此外,重定向不会由于与第一次失败相同的原因而发生。

    有关shell_s解析的详细信息,请参阅其手册(或相关shell的手册;可能是 POSIX Shell Command Language specification )一般来说,所有类似bourne的shell都会在扩展之前解析重定向。因此重定向运算符不能是变量的一部分(尽管重定向源/目标(文件名)可以是变量)。有些人喜欢用 埃瓦 使类似这样的东西工作,但这是一个坏主意,除非您完全了解安全影响。