Запись одного вывода на терминал и отправка всего остального в файл.

$ awk -F'  ' '{ gsub(" ", ",", $1); $1 = $1 "," } 1' OFS='  ' file.txt
jan,Feb,Mar,  Chennai India
jan,Feb,Mar,  Hyderabad India
jan,Feb,Mar,  Bangalore India

Здесь используется тот факт, что ввод может быть интерпретирован как два столбца, разделенных двойным -пробелом -. Он заменяет пробелы в первом столбце запятыми и добавляет запятую после них.

1
22.04.2020, 21:13
2 ответа

Вам не обязательно это делать. После использования execдля помещения всего содержимого stdout в файл, просто сгруппируйте операторы, которые вы хотите поместить в терминал, и teeв/dev/tty

exec > file.errout 2>&1

echo "messages only directed to the file"

{
    echo "message i want directed to the terminal and file" ;
    echo "more more message i want directed to the terminal and file" ;
} | tee /dev/tty

echo "more messages only directed to the file"

Вам не нужно exec >/dev/ttyкаждый раз, потому что в силу вашей начальной строки execвесь стандартный вывод записывается в файл.

1
19.03.2021, 02:26

В bash и zsh вы можете попробовать что-то подобное:

exec >file.errout 2>&1
  #...
exec {foo}>&1 > >(tee /dev/tty) 2>&1   # temporarily redirect
echo bla
ls no_such_file
exec >&$foo 2>&1                       # restore
  #... 

Перенаправление/восстановление exec {var}>&1... exec >&$varпохоже на exec 7>&1.. exec >&7, только этот bash сам получит неиспользуемый файловый дескриптор и сохранит его в переменной $var, вместо того, чтобы использовать какое-то фиксированное число, которое может конфликтовать с остальным кодом. Эта форма перенаправления является расширением ksh, также поддерживаемым в bash и zsh.

Комбинация exec > >(...)перенаправление + подстановка процесса хоть и практична, но подвержена некоторым странностям и ошибкам (и может не работать в ksh93 ).


Конечно, вы можете сгруппировать команды в блок {...}и перенаправить вывод всего блока в канал | tee /dev/tty. Это самое простое и самое портативное.

Проблема в том, что любые назначения переменных будут происходить в подоболочке, а не в вашем основном скрипте:

a=before
{
   a=$(pwd)
   #...
} | tee /dev/tty
echo "$a"  #  still "before"  
0
19.03.2021, 02:26

Теги

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