Как перенаправить вывод на переменную в оболочке?

У меня есть script такой

genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5

Я хочу получить поток, генерируемый genhash в переменной. Как перенаправить его в переменную $hash для сравнения внутри условного?

if [ $hash -ne 0 ]
  then echo KO
  exit 0
else echo -n OK
  exit 0
fi

Ответ 1

Используйте конструкцию $( ... ):

hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)

Ответ 2

Конечно, все эти другие ответы показывают, как не делать то, что задал ОП, но это действительно замалчивает всех нас, которые искали вопрос ОП.

Ответ на вопрос заключается в использовании команды read.

Вот как вы это делаете

# I would usually do this on one line, but for readability...
series | of | commands \
| \
(
  read string;
  mystic_command --opt "$string" /path/to/file
) \
| \
handle_mystified_file

Вот что он делает и почему это важно:

  • Предположим, что series | of | commands - очень сложная серия команд с каналами.

  • mystic_command может принимать содержимое файла как stdin вместо пути к файлу, но не --opt arg, поэтому он должен входить как переменная. Команда выводит измененный контент и обычно перенаправляется в файл или передается по другой команде. (Например, sed, awk, perl и т.д.)

  • read принимает stdin и помещает его в переменную $string

  • Помещение read и mystic_command в "подклассу" через скобки не требуется, но заставляет его течь как непрерывный канал, как если бы две команды находились в отдельном файле script.

Всегда есть альтернатива, и в этом случае альтернатива уродлива и нечитаема:

mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_file

По сравнению с

series | of | commands | (read string; mystic_command --opt "$string" /path/to/file) | handle_mystified_file

Это полностью хронологически и логично.

Ответ 4

Я предполагаю совместимый способ:

hash=`genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5`

но я предпочитаю

hash="$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)"

Ответ 5

Если конвейер слишком сложный для переноса в $(...), рассмотрите возможность записи функции. Доступны любые локальные переменные, доступные во время определения.

function getHash {
  genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
}
hash=$(getHash)

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Functions

Ответ 6

Вы можете сделать:

hash=$(genhash --use-ssl -s $IP -p 443 --url $URL)

или

hash=`genhash --use-ssl -s $IP -p 443 --url $URL`

Если вы хотите, чтобы весь цельный канал был назначен переменной, вы можете использовать весь конвейер в указанных выше назначениях.

Ответ 7

Иногда я получаю ошибку при использовании конструктора $(`code`).

Наконец, я получил некоторый подход к этому: fooobar.com/info/53119/...

В принципе, используя Tee, чтобы снова прочитать вывод и вставить его в переменную. Theres, как вы видите нормальный выход, затем читайте его из выпадающего меню.

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

Im so neewbie и все еще ищет полный выход и сохраняет в команде 1. С наилучшими пожеланиями.