перенаправить вывод команды в переменную и стандартный вывод в ksh - PullRequest
23 голосов
/ 26 октября 2011

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

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

Есть идеи?

Ответы [ 3 ]

57 голосов
/ 26 октября 2011

Как насчет:

VAR=$(ls | tee /dev/tty)
3 голосов
/ 30 июля 2013

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

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

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

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

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

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

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

0 голосов
/ 21 января 2015

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

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

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

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

Iнаписал это как пример:

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

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

  • varrun ls
  • varrun uname
  • varrun uname -a

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

...