Использование pstree
значительно упрощает проблему, но некоторые уточнения могут помочь.
Когда вы запускаете screen
, он запускает два процесса: screen
(родительский) и SCREEN
(дочерний):
-Параметр ls
screen
показывает идентификатор сеанса с идентификатором процесса дочернего пользователя. pstree
может это сделать. Связывание их вместе требует сценария. Вот пример:
# $Id: ps-screen,v 1.1 2016/10/23 22:19:56 tom Exp $
# http://unix.stackexchange.com/questions/172347/list-processes-running-inside-of-screen-manager-with-with-vt100-ansi-terminal-e
screen -ls | awk '/[0-9]+\./{print;}' | while read session
do
child=$(echo "$session" | awk '{sub("\..*","",$1); print $1;}')
printf '%s\n' "$session"
parent=$(ps -p $child -o ppid=)
pstree -p -a $parent
done
и пример вывода, для двух сеансов:
~ (101) ps-screen
38142.pts-1.vmw-debian7-64 (10/23/2016 06:20:28 PM) (Attached)
screen,38141
└─screen,38142
└─tcsh,38143
└─ps-screen,38161 /users/tom/bin/ps-screen
└─ps-screen,38164 /users/tom/bin/ps-screen
└─pstree,38169 -p -a 38141
3975.pts-0.vmw-debian7-64 (10/23/2016 06:15:28 AM) (Attached)
screen,3974
└─screen,3975
├─tcsh,5002
│ └─ded,19926 /usr/build//ncurses
│ └─vile,24647 /usr/build/ncurses/ncurses-6.0-20161029/NEWS
└─tcsh,36551
└─ded,36569 /tmp
Дальнейшее чтение:
Изменил код на этот, и он сработал:
content=$(curl -s -X GET -H "Header:Value" http://127.0.0.1:8200/etc)
username=$( echo jq -r '.data.value' <<< "${content}" )
echo ${username}
Это работает, только если вы потеряли "эхо" во второй строке.
content=$(curl -s -X GET -H "Header:Value" http://127.0.0.1:8200/etc)
username=$( echo jq -r '.data.value' <<< "${content}" )
echo ${username}
Вы можете преобразовать его в однострочный как:
username=$( curl -s -X GET -H "Header:Value" http://127.0.0.1:8200/etc | jq -r '.data.value' )
echo ${username}
Вы можете использовать встроенную функцию bash read
вместе с подстановкой процесса, соединяющей вывод jq с FIFO:
read username < <(curl -s -X GET -H "Header:Value" http://127.0.0.1:8200/etc | jq -r '.data.value')
Пока вам нужно присвоить только одно значение jq, другие предлагаемые решения проще. Настоящее решение с read
полезно, когда вам нужно назначить несколько клавиш нескольким переменным оболочки за один раз; тогда вам просто нужно использовать read var1 var2 var3 < <(...)
.
Вот более общие фрагменты для назначения вывода jq переменным оболочки, которые могут быть очень удобными.
Два метода для одиночного -линейного ввода (без петли):
IFS=$'\n' read -rd '' a b < <(echo '{"a":"1","b":"2"}' | jq -r '(.a,.b)'); declare -p a b
declare -- a="1"
declare -- b="2"
read a b < <(echo '{"a":"1","b":"2"}' | jq -r '[.[]] | @tsv'); declare -p a b
declare -- a="1"
declare -- b="2"
Примечание1 :@tsv использует разделитель пробелов; для значений, которые могут содержать пробелы, вы можете использовать формат @csv. Note2:IFS=$'\n' read -rd '' a b <
предполагает, что нет пустых выходных строк. Если некоторые ключи json пусты, вы можете использовать «jq» без «--raw» и удалить после "
с a=${a:1:-1}
, или вы можете использовать readarray
вместоread
(ср. пример ниже ).
Три метода ввода нескольких -строк (с петлей):
echo '[{"a":"1","b":"2"},{"a":"3","b":"4"}]' |
jq -r '.[]' | jq -r '{a, b} | [.[]] | @csv' |
while IFS= read -r i; do
IFS=, read -r a b <<< "$i"; a=${a:1:-1}; b=${b:1:-1}; declare -p a b;
done
declare -- a="1"
declare -- b="2"
declare -- a="3"
declare -- b="4"
echo '[{"a":"1","b":"2"},{"a":"3","b":"4"}]' |
jq -r '.[]' | jq -r '(.a,.b)' |
while IFS= read -r a; do
IFS= read -r b; declare -p a b;
done
declare -- a="1"
declare -- b="2"
declare -- a="3"
declare -- b="4"
echo '[{"a":"1","b":"2"},{"a":"3","b":"4"}]' |
jq -r '.[]' | jq -r '(.a,.b)' |
while readarray -n2 lines && [ ${#lines} -ne 0 ]; do
a="${lines[0]:0:-1}"; b="${lines[1]:0:-1}"; declare -p a b;
done
declare -- a="1"
declare -- b="2"
declare -- a="3"
declare -- b="4"