Вы можете решить такие проблемы, используя sed
оператор диапазона,
:
sed -e '
/^\[Thing2]$/,/^$/!b
/^[[:blank:]]\{4\}\[\[subthingB]]/,/^$/s|^\([[:blank:]]\{8\}thing_ading\) =.*|\1 = /YOUR/NEW/PATH/TO/DIR|
' yourinifile
Я могу воспроизвести вашу проблему на своем компьютере. Я вижу, что $PS1
печатается в момент выполнения tee $LOG
, а не после завершения скрипта. После выполнения скрипта командная строка пуста, но вы можете ввести следующую команду, и она будет выполнена.
Похоже, что подстановка процесса >()
выполняется tee
в фоновом режиме. Затем exec
перенаправляет весь вывод этому фоновому процессу. Но tee
из фона по-прежнему выводит вывод на терминал. Вы можете увидеть что-то подобное, если запуститеsyslog | tee&
В тот момент, когда весь вывод оболочки поступал в фоновый процесс tee
, bash выводил командную строку $PS1
, означающую, что вы уже можете вводить новые команды. И только после того, как командная строка была напечатана, ваша команда echo
напечатала свой вывод в фоновом процессе tee
, а затем tee
напечатала его на терминале.
Это как если бы вы запустили весь фон вашего скрипта
Примерно так я понимаю, почему ваша командная строка не печаталась после выполнения всего скрипта. Например echo "twas true..." | tee $LOG&
. Здесь &
означает «запустить предыдущую команду в фоновом режиме».
Попробуйте использовать следующий код. Он будет делать то же самое, но без этой проблемы.
#!/bin/bash
LOG="./test.log"
rm -f $LOG
{
if [[ "$1" = "T" ]]; then
echo "twas true..."
exit 0
else
echo "twas false..."
exit 100
fi
} | tee $LOG 2>&1
Также. По умолчанию tee
перезаписывает файл, поэтому кажется, что rm -f $LOG
не нужен.