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

时间:2010-05-27 03:35:04

标签: linux bash

这有效:

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

HELP!

2 个答案:

答案 0 :(得分:1)

BASH FAQ entry #50

  

我正在尝试将命令放在变量中,但复杂的情况总是会失败!

     

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

答案 1 :(得分:1)

  

这有效:

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解析的详细信息,请参阅其手册(或相关shell的手册;可能是POSIX Shell Command Language specification)。通常,所有类似Bourne的shell在扩展之前解析重定向。因此重定向操作符不能是变量的一部分(尽管重定向源/目标(文件名)可以是变量)。有些人喜欢使用 eval 来制作像这样的工作,但除非你完全了解安全隐患,否则这是一个坏主意。