Как мне прочитать стандарт в переменную bash без использования подоболочки или именованного канала - PullRequest
0 голосов
/ 22 июня 2011

Внутри bash-скрипта я передаю вывод запроса curl, чтобы затем тиражировать, а затем дублирую вывод на множество подоболочек. В конце каждой подоболочки я хочу присвоить результат переменной, объявленной в моем скрипте:

#!/bin/bash

token_secret=""
token_value=""

function extractTokenSecret() {
  sed -n 's/.*secret":"\([^"]*\)".*/\1/p'
}

function extractTokenValue() {
  sed -n 's/.*token":"\([^"]*\)".*/\1/p'
}

function createToken() {
  curl -v \
  -X POST \
  -s http://localhost:8080/token | tee >/dev/null \
  >(extractTokenSecret | [ASSIGN THE VARIABLE token_secret HERE]) \
  >(extractTokenValue | [ASSING THE VARIABLE token_value HERE] \
}

Любая помощь приветствуется

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Команды, которые потребляют вывод вашей команды curl, перечислены после канала "|"персонаж.Итак ... они будут подоболочками текущего командного процессора, как вы и сказали в своем вопросе.Другими словами, они являются дочерними процессами и не могут напрямую влиять на среду родительской оболочки.

Вам понадобится найти другой способ обработки вывода команды curl, который позволит вашему сценарию назначатьтекст в переменные в текущей оболочке.т.е. не пытайтесь выполнить назначение в качестве второй или третьей команды в конвейере.Для этого такие вещи, как $ () и eval (1) ваши друзья.

Может быть что-то вроде:

$ output=$(curl options...)
$ variable1=$(echo $output | sed ...)
$ variable2=$(echo $output | sed other stuff...)
1 голос
/ 22 июня 2011

Что-то в этом духе должно работать (у меня нет четкого представления о том, насколько точно вы пытались его разделить, но это должно быть основой):

function createToken() {
  original=`curl -v -X POST -s http://localhost:8080/token`
  token_secret=`extractTokenSecret $original`  # And then get extractTokenSecret to use $1
  token_value=`extractTokenValue $token_secret`  # Ditto
}

Также, без пробелов вокруг =, пожалуйста.

token_secret=''
token_value=''
...