我正在尝试通过ksh脚本自动执行ClearCase签到。存在一个奇怪的问题,即以下命令在自动化脚本的一部分时不会运行,但如果我将其粘贴到命令行中则运行正常。
脚本片段:
for dir in `cat $DIRS`
do
RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec 'cleartool co -nc \$CLEARCASE_PN'"
print $RUNCMD
$RUNCMD
done
exit 1
生成以下命令
cleartool find <<vob_directory>> -type f -exec 'cleartool co -nc $CLEARCASE_PN'
这是错误
cleartool: Error: Extra arguments: "co"
Usage: find { pname ... [-depth | -nrecurse | -directory]
| [pname ...] -all [-visible | -nvisible]
| -avobs [-visible | -nvisible]
}
[-name 'pattern']
[-cview]
[-user login-name]
[-group group-name]
[-type {f|d|l}...]
[-follow]
[-kind object-kind]
[-nxname]
[-element query]
[-branch query]
[-version query]
{-print | -exec command-invocation | -ok command-invocation} ...
我在这里做错了什么?
答案 0 :(得分:2)
虽然ksh
{我的第一次测试位于bash
),但您推荐的eval
solution更常见(bash eval
is a bit different)。
您可以在clearcase multisite script中看到它 如果您需要将结果存储在变量中进行处理,可以按照this question:
进行操作for dir in `cat $DIRS`
do
RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec 'cleartool co -nc \$CLEARCASE_PN'"
print $RUNCMD
eval "res=\$( $RUNCMD )"
print $res
done
exit 1
原始答案:
您可能希望添加some quotes,以防止shell过早扩展您的命令,例如this example:
RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec "'cleartool co -nc \$CLEARCASE_PN'""
甚至用双引号(例如this thread)
对单引号进行查询RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec "cleartool co -nc \"\$CLEARCASE_PN\""
(请注意\"
周围的“\$CLEARCASE_PN
”,以便考虑其中包含空格的路径名称。
答案 1 :(得分:1)
我无法说出为什么这样有效,但是一位同事告诉我eval
。结果证明了这一点。
for dir in `cat $DIRS`
do
RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec 'cleartool co -nc \$CLEARCASE_PN'"
print $RUNCMD
eval $RUNCMD
done
exit 1