Проблема с перенаправлением вывода в файл журнала и консоль в сценарии bash

Вы можете решить такие проблемы, используя sedоператор диапазона,:

sed -e '
   /^\[Thing2]$/,/^$/!b
   /^[[:blank:]]\{4\}\[\[subthingB]]/,/^$/s|^\([[:blank:]]\{8\}thing_ading\) =.*|\1 = /YOUR/NEW/PATH/TO/DIR|
' yourinifile
  • Сначала вы выбираете правильный диапазон, пропуская неправильные диапазоны.
  • Затем, когда в нужном диапазоне, вы выполняете подстановку нужной переменной ding _.
0
14.09.2020, 17:22
1 ответ

Я могу воспроизвести вашу проблему на своем компьютере. Я вижу, что $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не нужен.

0
18.03.2021, 23:05

Теги

Похожие вопросы