1

我正在尝试通过 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} ...

我在这里做错了什么?

4

2 回答 2

2

ksh虽然(我的第一个测试是在)bash,您推荐的eval解决方案更常见(bash eval有点不同)。

您可以在这个clearcase multisite script中看到它。
如果您需要将结果存储在变量中进行处理,您可以按照以下问题进行操作:

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

原答案:

您可能需要添加一些引号以防止 shell 过早扩展您的命令,如下例所示

RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec "'cleartool co -nc \$CLEARCASE_PN'""

甚至用双引号来改变单引号(如在这个线程中)

RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec "cleartool co -nc \"\$CLEARCASE_PN\""

(注意\"周围的 ' '\$CLEARCASE_PN以考虑到路径名中带有空格)

于 2013-04-17T18:55:28.070 回答
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
于 2013-04-17T21:55:56.913 回答