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

У меня такой сценарий

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

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

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

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

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

TL; DR

Чтобы сохранить "abc" в $foo :

 echo "abc" | read foo 

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

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

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

  1. Давайте сделаем вид, что series | of | commands series | of | commands series | of | commands – очень сложная серия команд с каналами.

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

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

  4. Помещение read и команды mystic_command в «вспомогательную оболочку» с помощью скобок не требуется, но делает его streamом, как непрерывный канал, как будто 2 команды, где в отдельном файле сценария.

Всегда есть альтернатива, и в этом случае альтернатива является уродливой и нечитабельной по сравнению с моим примером выше.

 # my example above as a oneliner series | of | commands | (read string; mystic_command --opt "$string" /path/to/file) | handle_mystified_file # ugly and unreadable alternative mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_file 

Мой путь полностью хронологический и логичный. Альтернатива начинается с 4-й команды и выдает команды 1, 2 и 3 в подстановку команд.

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

Этот метод использует « замещение процесса » Bash, чтобы не путать с « заменой команд ».

Вот несколько хороших ссылок:

Я думаю, совместимый способ:

 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)" 

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

 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

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

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

или

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

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

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

Наконец, я получил некоторый подход к этому: https://stackoverflow.com/a/7902174/2480481

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

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

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

  • Как скрыть вывод команды в bash
  • Извлечь подстроку в Bash
  • Повторение псевдонимов в .bashrc
  • В чем разница между командами Linux (Ubuntu) и Mac?
  • Почему меньше хвостового режима перестает работать?
  • Есть ли LAME c ++ wraper \ simplifier (работает на Linux Mac и Win из чистого кода)?
  • '\ r': команда не найдена - .bashrc / .bash_profile
  • Потеря новой строки после присвоения результата grep переменной оболочки
  • Заменить одну подстроку для другой строки в сценарии оболочки
  • Какие символы нужно избегать при использовании Bash?
  • Когда нам нужны фигурные скобки вокруг переменных оболочки?
  • Interesting Posts

    Как остановить мышь "пауза"

    Как восстановить Chrome без кнопки «Восстановить» и файлов «Последняя сессия» и «Последние вкладки»?

    Регулярное выражение для повторения любого символа более 10 раз

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

    Есть ли способ изменить адресную строку браузера без обновления страницы?

    Почему я получаю запрос OPTIONS вместо запроса GET?

    Получение прав на показ для второго пользователя в Ubuntu

    В VirtualBox не удается получить максимальное разрешение экрана для гостевой ОС

    AngularJS – конвертировать даты в controller

    MISCONF Redis настроен на сохранение снимков RDB

    Альтернатива для выполнения выбора в Swift?

    Повторная задача Task.ConfigureAwait (continueOnCapturedContext: false)

    Как контролировать программы и службы при запуске Windows?

    «Распаковка» кортежа для вызова соответствующего указателя функции

    Как я могу использовать индексы строковой развертки в Swift 4?

    Давайте будем гением компьютера.