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

#shell #scripting #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
 

Есть какие-нибудь идеи?

Комментарии:

1. Просто любопытно, что ограничение в 1 строку. это заставляет меня думать, что вы не являетесь корнем, а также пользователем целевой системы. Я не могу понять, почему у вас есть это ограничение. В любом случае я отправил вам ответ «сделай сам».

Ответ №1:

Как насчет:

 VAR=$(ls | tee /dev/tty)
 

Комментарии:

1. В зависимости от вашей ОС, var=$(ls | tee /proc/$$/fd/1) может работать тоже.

2. Даже если это работает отлично, я отправляю вам пример «сделай сам». Я новичок в Linux / bash, но мне нравится изучать эти советы: D

3. Обратите внимание, что это (tee) улавливает только стандартный вывод и что программы часто не окрашивают его (т. Е. Используют VAR=$(ls --color | tee /dev/tty) для получения цветного вывода).

Ответ №2:

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

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

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

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

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

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

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

Комментарии:

1. Обязательно заключите echo в двойные кавычки, если результат состоит из более чем одной строки. VAR=$(ls -1); echo "$VAR" . в противном случае он сжимается в одну строку

2. @hoss вы можете объяснить, почему это происходит?

Ответ №3:

Как я понимаю, 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

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