Это упрощенная версия используемого сценария: В упрощенной версии tt следует читать файл input
по очереди, а затем печатать его на стандартный вывод, а также записывать на файл log
.Командная строка, появляющаяся во время выполнения сценария bash
input
файл:
asas
haha
asha
hxa
Сценарий (названный simple
):
#!/bin/bash
FILE=input
logfile="log"
exec > >(tee "$logfile") # redirect the output to a file but keep it on stdout
exec 2>&1
DONE=false
until $DONE; do
read || DONE=true
[[ ! $REPLY ]] && continue #checks if a line is empty
echo "----------------------"
echo $REPLY
done < "$FILE"
echo "----------------------"
echo ">>> Finished"
Выход (на консоли):
-bash-3.2$ ./simple
-bash-3.2$ ----------------------
asas
----------------------
haha
----------------------
asha
----------------------
hxa
----------------------
>>> Finished
В это время мне нужно нажать войти для завершения сценария. Обратите внимание, что во время выполнения появилось командное приглашение -bash-3.2$
.
Я проверил, что эти строки виноваты:
exec > >(tee "$logfile") # redirect the output to a file but keep it on stdout
exec 2>&1
Без них выход, как ожидается:
-bash-3.2$ ./simple
----------------------
asas
----------------------
haha
----------------------
asha
----------------------
hxa
----------------------
>>> Finished
-bash-3.2$
Что больше не нужно нажимать ввести для завершения сценария , К сожалению, мне нужно сохранить вывод как на консоль (stdout), так и на файл журнала.
Как это можно исправить?
Можно ли исправить это, не изменяя каждое 'echo' во всем скрипте? Скрипт очень большой. –
Если вы не хотите изменять все, и вы не против записи в журнал _everything_, вы можете выполнить сам скрипт, например. '$ ./your_script.sh | tee -a $ LOG_FILE.' – Ben