2013-04-17 2 views
1

Я пытаюсь автоматизировать check-ins ClearCase с помощью скрипта 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} ... 

Что я здесь делаю неправильно?

ответ

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 для того, чтобы предотвратить оболочку расширить команду слишком рано, так как в this example:

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

или даже chaging в си ngle цитата кавычками (как в this thread)

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

(обратите внимание на «\"» вокруг \$CLEARCASE_PN для того, чтобы принять в имена учетной записи пути с пространством в них)

+0

Я думаю, что вы на что-то о том, что команда была расширена (или * не * расширена) правильно. Я попробовал несколько «стилей» кавычек, но в конечном счете никто не работал. Цените, что вы даете мне множество глаз. – user1766760

+0

спасибо за ссылки - я отмечаю ваш ответ как ответ, потому что это будет более полезно. И я не знаю о различиях между 'ksh' и' bash'. – user1766760

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 
+0

Отлично. +1. Я ссылался на него в своем вопросе, с дополнительной ссылкой на другие вопросы ksh eval. – VonC

Смежные вопросы