【问题标题】:ksh/bash run command line from variableksh/bash 从变量运行命令行
【发布时间】:2015-06-25 08:48:50
【问题描述】:

我在 cmd 变量中设置了 find 语法:,我使用 ksh shell/bash

 # cmd=" find /usr/cti/conf -name \"*.tgz*\" "
 # echo $cmd
   find /usr/cti/conf/ -name "*.tgz*"

那么为什么当我想像下面这样运行 cmd 时,我实际上并没有激活 find ...

 # exec $cmd
  appserver1a:/var/tmp/    ROOT #     ( this exit from the shell )

当我用双括号运行时它也不起作用

  exec "$cmd"
  ksh:  find /usr/cti/conf/backup -name "*.tgz*" :  not found

解决方法是什么?

备注我不想这样设置 cmd(这是可行的)

     cmd=`  find /usr/cti/conf/backup -name "*.tgz*"  `

      cmd=$( find /usr/cti/conf/backup -name "*.tgz*" )

【问题讨论】:

  • 如果只说:$cmd 而不是 exec "$cmd" 会发生什么?
  • 你可以试试cmd=(find /usr/cti/conf/backup -name "*.tgz*")然后执行${cmd[@]}

标签: linux bash ksh


【解决方案1】:

将您的命令字符串存储在变量中:

cmd="find /usr/cti/conf/backup -name \"*.tgz*\""

然后,评估变量内容:

eval "$cmd"

更新:根据alvitsGordon,更安全的选择:

cmd=(find /usr/cti/conf/backup -name "*.tgz*")
${cmd[@]}

【讨论】:

  • 不要这样做——eval 是对微妙和难以理解的错误的公开邀请。请改用数组(参见@alvits 的评论)。
【解决方案2】:

这两种解决方案 - 下面提供的一个和 Eugeniu Rosca 发布的一个 - 似乎都对我有用。

cmd="find /usr/cti/conf/backup -name \"*.tgz*\""
exec $cmd

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    相关资源
    最近更新 更多