Перенаправление вывода команды на переменную, а также на консоль в bash не работает - PullRequest
0 голосов
/ 03 июня 2019

У меня есть простая задача из скрипта оболочки - перенаправить вывод команды в переменную, а также в stdout. Я уже прошел вывод команды перенаправления в переменную и стандартный вывод в ksh и придумал:

VAR1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee > /proc/$$/fd/1)

Однако вышесказанное не работает для меня. Выходные данные отображаются в STDOUT нормально, но не сохраняются в VAR1. Что мне здесь не хватает?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

У вас есть ненужный редирект на эту команду.Использование:

VAR1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee /proc/$$/fd/1)

Они tee работают так, что они копируют свои входные данные в свои выходные данные, а также в любые файлы, имена которых вы даете в качестве аргументов.Перенаправление просто сообщает о своем проходном поведении.

Что-то еще, что вы могли бы сделать - поскольку мы здесь не говорим о какой-то длительной команде - сначала установите переменную, а затем напечатайте ее значение:

VAR1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' )
echo "$VAR1"

... намного проще: -)

1 голос
/ 03 июня 2019

Перенаправление вывода команды на переменную, а также на консоль в bash:

Вы можете использовать этот трюк:

var1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee /dev/tty)

или

var1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee /dev/stderr)
Команда

tee запишет вывод в /dev/tty, который является вашим текущим терминалом.

Также предлагаем вам избегать использования всех имен переменных caps, чтобы избежать вероятности переопределения env var.

PS: У меня обе команды работают в OSX и Ubuntu.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...