Вопрос или проблема
Я создал приведенный ниже скрипт expect и мне нужно зафиксировать вывод этого скрипта.
SOURCE_FILE=`ls -l *.txt --time-style=+%D | grep ${DT} | grep -v '^d' | awk '{print $NF}' `
if [ -n "${SOURCE_FILE}" ]
then
cp -p ${SOURCE_FILE} ${T_FILES}
/usr/bin/expect<<EOD
set timeout 60
spawn sftp $ES_SFTP_USER@$ES_SFTP_HOST_NAME:$R_LOCATION
expect "*?assword:"
send "$password\r"
expect "sftp>"
send "put /opt/AppServer/ES_TEST/todays_report/*.txt\r"
expect "sftp>"
send "bye\r"
expect EOD
EOD
else
echo "Нет файлов для копирования" >> ${LOGFILE}
fi
Мне нужно зафиксировать вывод команды expect в ${LOGFILE}
. Как это можно сделать?
Я пытался добавить ниже приведенные вещи, но это не сработало. Что можно сделать?
/usr/bin/expect<<EOD >> ${LOGFILE} 2>&1
set timeout 60
spawn sftp $ES_SFTP_USER@$ES_SFTP_HOST_NAME:$R_LOCATION
expect "*?assword:"
send "$password\r"
expect "sftp>"
send "put /opt/AppServer/ES_TEST/todays_report/*.txt\r"
expect "sftp>"
send "bye\r"
expect EOD
EOD
Кажется, что LOGFILE вне области видимости, вы его экспортировали? Посмотрите переменные окружения.
Вам нужно экспортировать переменную в окружение или передать её в качестве аргумента.
например.
Допустим, ваша программа называется abc
, тогда сделайте:
LOGFILE=./logdir/logfile
export LOGFILE
./abc
или
LOGFILE=./logdir/logfile ./abc
В качестве альтернативы можно передать как аргумент:
./abc "./logdir/logfile"
И в программе иметь:
logfilename="$1"
Приведенная ниже перенаправление теперь работает нормально. Я ничего нового не добавлял.
/usr/bin/expect<<EOD > ${LOGFILE}
set timeout 60
spawn sftp $ES_SFTP_USER@$ES_SFTP_HOST:$R_LOCATION
expect "*?assword:"
send "$password\r"
expect "sftp>"
send "put /opt/AppServer/ES_billing_report/todays_report/*.txt\r"
expect "sftp>"
send "bye\r"
expect EOD
EOD
Ответ или решение
Для того чтобы корректно записать вывод вашего скрипта Expect в файл журнала, необходимо учесть несколько аспектов, которые могут повлиять на правильность выполнения. Давайте подробно разберем ваш скрипт и предоставим рекомендации по его оптимизации.
Проблема и решение
Ваша основная задача заключается в том, чтобы логировать вывод команды Expect в переменную ${LOGFILE}
. На первый взгляд, вы правильно использовали редирект в скрипте Expect, но существует несколько нюансов, которые необходимо учесть.
Рекомендации по изменению скрипта
-
Проверка переменной LOGFILE: Убедитесь, что переменная
${LOGFILE}
правильно инициализируется и доступна в рамках вашего скрипта. Это можно сделать, экспортировав переменную или передав её как параметр командной строки.LOGFILE="./logdir/logfile" export LOGFILE
Или передача как параметр:
./abc "./logdir/logfile"
-
Правильный синтаксис для редиректа: При использовании редиректа для Expect необходимо убедиться, что это сделано корректно. Вы уже нашли правильный способ для редиректа, но вот еще вариант как можно оформить ваш код для большей наглядности:
if [ -n "${SOURCE_FILE}" ]; then cp -p ${SOURCE_FILE} ${T_FILES} /usr/bin/expect <<EOD >> ${LOGFILE} 2>&1 set timeout 60 spawn sftp $ES_SFTP_USER@$ES_SFTP_HOST_NAME:$R_LOCATION expect "*?assword:" send "$password\r" expect "sftp>" send "put /opt/AppServer/ES_TEST/todays_report/*.txt\r" expect "sftp>" send "bye\r" expect eof EOD else echo "No Files to copy" >> ${LOGFILE} fi
-
Использование
expect eof
: Включениеexpect eof
в конце вашего скрипта Expect гарантирует, что вся сессия завершится корректно и вы получите весь вывод. -
Проверка доступа к файлам: Убедитесь, что у вашего скрипта есть права на запись в файл журнала. Это может быть критичным, если скрипт запускается от учетной записи, которая не имеет соответствующих прав.
Заключение
Соблюдение правил, упомянутых выше, поможет вам успешно логировать вывод команды Expect в задаваемый файл. Убедитесь, что переменная ${LOGFILE}
правильно задана и доступна в области видимости вашего скрипта, что особенно важно в сценариях, где вы используете переменные окружения. В случае, если вывод по-прежнему не записывается, проверьте права доступа и существование каталога для записи логов.
Ваш скрипт теперь эффективно записывает все необходимые данные, что помогает в дальнейшем анализе и отладке.