перенаправить вывод команды в переменную и стандартный вывод в ksh

У меня есть команда оболочки. Я хотел бы записать вывод на стандартный вывод и сохранить его в переменной. Я хотел бы решить это с помощью одной команды. Я пробовал эти вещи.

ls > $VAR          # redirects the output to file which name is stored in $VAR
ls | tee -a $VAR   # writes to standard output as well as in file which name is stored in $VAR
VAR=`ls`           # output into $VAR, but it is not sent to standard output
VAR=`ls`;echo $VAR # ok, it works but these are two commands

Любая идея?


person Attila Zobolyak    schedule 26.10.2011    source источник
comment
Просто интересно узнать об ограничении в 1 строку. это заставляет меня думать, что вы не являетесь корнем, а также пользователем целевой системы. Я не могу понять, почему у вас есть это ограничение. В любом случае, я отправил вам ответ «сделай сам».   -  person m3nda    schedule 21.01.2015


Ответы (3)


Как насчет:

VAR=$(ls | tee /dev/tty)
person Gary Barker    schedule 26.10.2011
comment
В зависимости от вашей ОС, var=$(ls | tee /proc/$$/fd/1) тоже может работать. - person glenn jackman; 26.10.2011
comment
Даже если это работает отлично, я публикую вам пример сделай сам. Я новичок в Linux/bash, но мне нравятся эти советы :D - person m3nda; 21.01.2015
comment
Обратите внимание, что это (тройник) улавливает только вывод STDOUT и что программы часто не окрашивают его (т. е. используют VAR=$(ls --color | tee /dev/tty) для получения цветного вывода). - person rugk; 28.09.2017

отличный ответ от @Gary_Barker, но это возможно не во всех системах.

В нашем teamcity нет char-консоли. И есть еще одна маленькая проблема.

Если я использую

VAR=$(ls -1); echo $VAR

это не то же самое, что ls -1

Мое решение работает, если не имеет значения, что вывод исходит из канала ошибок.

VAR=$(ls -1 | tee >&2)

person S.W.Joerns    schedule 30.07.2013
comment
Убедитесь, что эхо заключено в двойные кавычки, если результат состоит из более чем одной строки. VAR=$(ls -1); echo "$VAR". иначе он сжимается в одну строку - person hoss; 29.04.2015
comment
@hoss, можешь объяснить, почему это происходит? - person Prabhat Kumar Singh; 14.02.2018

Насколько я понимаю, VAR=`ls`;echo $VAR в порядке, но вам не нравится, потому что на нем 2 команды.

Пока @Gary-Barker работает, я не проверял все системы. Если у вас возникли проблемы с тройником или чем-то другим, вы ВСЕГДА можете построить свой собственный.

Я не знаю, знаете ли вы это, но многие программы, которые вы можете использовать в Linux, представляют собой просто набор кода, использующий небольшие двоичные файлы в системе. Хотя это правда, нет смысла использовать 1 или 2 команды, потому что окончательное выполнение на самом деле состоит из множества маленьких команд.

Итак, если ваша реальная проблема заключается в том, что вы можете написать только одну команду в своей цели, вы можете написать свое собственное «приложение», создав сценарий sh в папке /sbin и оставив его без расширения .sh (поскольку они выполняются с ./ или префикс sh, а не по имени)

Я написал это в качестве примера:

#!/bin/bash if [ $1 ] then VAR=$*; echo $VAR fi

Для этого примера я создал файл /sbin/varrun. Я пробовал это с помощью следующих команд с успешным (нормальным) выводом:

  • varrun ls
  • varrun uname
  • varrun uname -a

Обратите внимание, что я не использовал «кавычки» для команд с пробелами.

person m3nda    schedule 21.01.2015