Я полагаю, что "опция" размера стопки ядра изменения давно в прошлом...
Вот версия сценария, который работает и чинит некоторые вещи, которые Вы не могли рассмотреть:
#!/bin/bash
(
echo '-- some startup SQL*plus code'
echo 'set echo off;'
echo '-- etc'
find /home/devuser -name 'BI*' -type f |
awk -- '{
gsub("\047", "\047\047", $0);
printf("INSERT INTO table1(file_name,status) " \
"VALUES(\047%s\047, \047N\047);\n", $0);
}'
echo 'COMMIT;'
) | sqlplus -s schema_name/passwd
Функции:
-type f
в find
) соответствие шарику ‘BI*’ — видит страницу справочника для find(1)
для различных доступных типов файлов.\047
восьмеричный код ASCII одинарной кавычки, полезной, так как код awk уже является внутренними одинарными кавычками.| sqlplus ...
часть последней строки и Вы видите сгенерированный сценарий SQL.Ограничения:
Сгруппированный раздел в начале генерирует сценарий, включая пролог (полезный для сообщения SQL*plus, что сделать с некоторыми его 'более хорошими' функциями), и эпилог для фиксации транзакции.
Что случилось с Вашей собственной версией сценария:
VAR=foo
. Нет VAR = foo
(да, это имеет значение; последний попробует к команде выполнения VAR
с аргументами =
и foo
, не выполняют переменное присвоение),$names
расшириться до результатов find
команда, необходимо сказать names=$(find ...)
или names=`find ...`
, нет names=find ...
.<<EOF
отправляется в SQL*Plus, таким образом, фрагмент сценария удара Вы включаете (с for
цикл), интерпретируется SQL*Plus, не колотят. Это не допустимый SQL, и SQL*Plus естественно дросселирует на нем.for
цикл является SQL-оператором, но Вы ожидаете, что это будет interprered ударом, который не является правильным. Должен быть echo
перед SQL insert
оператор (и конечно вся вещь из <<EOF
раздел).EOF
самостоятельно. <<EOF
означает ‘чтение, пока со строкой не встречаются, который запускается с EOF
’.for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done <<anything given here is taken as variable>>
Это - базовый синтаксис и после done
, фиксация должна быть дана в следующей строке.
Таким образом, Ваш код должен быть.
#!/bin/bash
names = find /home/devuser -name 'BI*'
sqlplus -s schema_name/passwd << EOF
for name in {names[@]}
do
insert into table1(file_name,status) values('$name','N');
done
commit;
exit