Я хочу скопировать stdout в файл журнала с в пределах сценарий bash, то есть я не хочу вызывать скрипт с выходом, переданным в tee, я хочу сам сценарий для его обработки. Я успешно использовал this ответ для достижения этой цели, используя следующий код:Копировать * небуферизованный * stdout для файла из самого скрипта bash
#!/bin/bash
exec > >(sed "s/^/[${1}] /" | tee -a myscript.log)
exec 2>&1
# <rest of script>
echo "hello"
sleep 10
echo "world"
Это работает, но имеет недостаток выхода буферизации, пока сценарий не будет завершен, а также обсуждается в связанном ответ. В приведенном выше примере как «привет», так и «мир» будут отображаться в журнале только после того, как пройдут 10 секунд.
Я знаю команду stdbuf, и если запустить скрипт с
stdbuf -oL ./myscript.sh
то стандартный вывод действительно непрерывно печатается как в файл и терминалом. Однако мне бы хотелось, чтобы это было обработано и внутри скрипта. Есть ли способ объединить эти два решения? Я бы предпочел не прибегать к сценарию обертки, который просто вызывает исходный скрипт, заключенный в «stdbuf -oL».
Спасибо. Эти ограничения действительно в порядке. Тбх, возможно, это не самое чистое решение :-), но я попробую. – JHH