Мне нужно видеть вывод на экране и в то же время grep выводить и отправлять результат grep в переменную. Я думаю, что это можно сделать с тройником, но я не могу понять, как именно. Я попытался
mycommand | tee myvar=$(grep -c keyword)
mycommand | tee >(myvar=$(grep -c keyword))
но это не работает. Как должно быть, желательно без записи в файлы?
Вы можете сделать это с помощью некоторых манипуляций с файловыми дескрипторами:
{ myvar=$(mycommand | tee /dev/fd/3 | grep keyword); } 3>&1
Объяснение: дескриптор файла # 0 используется для стандартного ввода, # 1 для стандартного вывода и # 2 для стандартной ошибки; №3 обычно не используется. В этой команде 3>&1
копирует FD # 1 (стандартный вывод) на # 3, что означает, что внутри { }
, есть два способа отправить вывод на терминал (или куда идет стандартный вывод).
В $( )
захватывает только FD # 1, поэтому все, что отправлено на # 3 изнутри, будет его обходить. Что именно tee /dev/fd/3
делает со своим вводом (а также копирует его на свой стандартный вывод, который является grep
стандартный ввод команды).
По сути, FD # 3 используется для контрабанды продукции через $( )
захватить.
Вы бы сделали это:
myvar=$( mycommand | tee /dev/tty | grep -c keyword )
Используйте tee, чтобы направить вывод прямо на ваш терминал, а stdout - для анализа вывода и сохранения его в переменной.
Вы можете использовать, как показано ниже. Если вы хотите добавить, используйте -a
вариант с тройником помните, что он создаст файл с вашим именем переменной.
$ ls | tee $(echo asktyagi)
asktyagi1
$ ls -lthr
total 12K
-rw-rw-r--. 1 asktyagi asktyagi 8 Oct 29 08:54 asktyagi1
-rw-rw-r--. 1 asktyagi asktyagi 23 Oct 29 08:54 asktyagi