2013-12-10 3 views
0

В настоящее время я использую следующую строку, чтобы найти несколько скриптов и выполнить их. Сценарии названы: my_script_0.sh, my_script_1.sh и т.д.linux find exec positional параметр

find $MY_HOME/SHELL/my_script_[0-9].sh -type f -exec csh -c '"$1" >& "$logfile" &' {} \; 

Это работает отлично, за исключением, что теперь я хотел бы создать уникальный $logfile для каждого из исполняемых скриптов. Я понимаю, что с помощью awk я мог бы сделать что-то подобное, чтобы захватить номер файла, а затем потенциально использовать его в имени файла журнала.

find $MY_HOME/SHELL/my_script_[0-9].sh -type f | awk -F"\\.|_" '{print $4}' 

Вопрос заключается в том, что я не верю, что я могу использовать AWK с первоначальным утверждением, так как мне нужно позиционное параметр, чтобы быть полный путь/имя файла.

В идеале я хотел бы просто использовать другой позиционный параметр с помощью команды find -exec. Он существует?

ответ

1

Опция -execfind просто выдает данные аргументы. Поскольку вы передаете его csh -c ..., он запустит новую оболочку, в которую вы можете опционально передать некоторые аргументы (один из которых - {}). Эти аргументы затем устанавливаются как позиционные аргументы $1, $2, $3, ... ,$n в новой оболочке. В этом случае результаты find передаются один за другим и используются как $1 в оболочке.

Я предлагаю альтернативу вашей find команды, которая использует цикл вместо:

foreach script ($MY_HOME/SHELL/my_script_[0-9].sh) 
    csh -c "$script >& $script:r.log" 
end 

:r полосы расширения переменного это придает таким образом мы получаем лог-файл: my_script_n.log для сценария my_script_n.sh.

Я проверил эти ссылки на синтаксис C-оболочки:

+0

Оказывается, что CSH не имеет для цикла? – McArthey

+0

@McArthey Хорошо, этот ответ работает в (ba) sh, запуская csh в подоболочке. Сожалею. –

+0

Отлично, спасибо! Похоже, что просто используя 'foreach script ($ MY_HOME/SHELL/my_script_ [0-9] .sh)' позаботится об этом. – McArthey

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