#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
Обратите внимание, что я не использовал «кавычки» для команд с пробелами.