Назад | Перейти на главную страницу

тройник и присвоение переменной?

Мне нужно видеть вывод на экране и в то же время 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