Почему круглые скобки возвращают статус выхода, а не фигурные скобки

альтернативное решение(jtc)упрощает вопрос с помощью стандартного cli:

bash $ echo $OUTPUT | jtc -rl -w'[+0]' -w'[+0][conns]' | sed 's/: {.*//g; s/^"conns"://' | xargs -n2
1 1.0
2 2.0
bash $ 

jtc (в отличие от jq )— это утилита, которая ограничивает свою функциональность только операциями json (, поэтому ее интерфейс значительно проще ), однако манипулирование статьями за пределами модели данных JSON переносится на внешние инструменты unix.

РЕДАКТИРОВАТЬ :Новая версия jtcподдерживает более простое решение:

bash $ jtc -w'l:v[-1]k' -T '"{key} {con}"' -qq <<<$OUTPUT
1 1.0
2 2.0
bash $ 

5
03.02.2021, 00:59
2 ответа

Посмотрите на трассировку выполнения команды(set -x). С подтяжками:

+ no_func
./a: line 3: no_func: command not found
+ echo 'there is nothing'
there is nothing
+ exit 1

exitвыходит из оболочки (sub ). Поскольку фигурные скобки не создают подоболочку, exitвыходит из основного процесса оболочки, поэтому он никогда не достигает точки, в которой он должен работать echo $?.

16
18.03.2021, 22:32

Когда вы используете фигурные скобки, ваш сценарий завершается со статусом 1 до того, как он достигает echo $?в сценарии.

Вариант с подоболочкой:

$./script1.sh
./script1.sh: line 3: no_func: command not found
there is nothing 
1 # <-- exit status of subshell
$ echo $?
0 # <-- exit status of script

Вариант с подтяжками:

$./script2.sh
./script2.sh: line 3: no_func: command not found
there is nothing # <-- the script exits with 1 after this line
$ echo $?
1 # <-- exit status of script
12
18.03.2021, 22:32

Теги

Похожие вопросы