Как записать вывод группы команд bash (фигурные скобки) в переменную окружения - PullRequest
0 голосов
/ 10 января 2019

Например, я могу сделать это с помощью подоболочки:

VAL=$( do_something )

но как мне добиться того же с помощью фигурных скобок, чтобы команда НЕ выполнялась в подоболочке? То есть это не работает:

VAL={ do_something; }

ТИА.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

set -e довольно жестко. Попробуйте что-то вроде

trap 'err=$?;
      echo >&2 "ERROR $err in $0 at line $LINENO, Aborting";
      exit $err;' ERR

Это намного более информативно при чтении ваших журналов, и вы можете поместить подобную команду в подоболочку. Да, это означает добавление его в подоболочку ... но я часто делаю подобные вещи в определениях функций, которые вызываются в подоболочках. Хорошо работает.

Используется:

$ trap 'echo BOOM' ERR # parent shell trap for demo
$ false                # trigger manually for demo
BOOM
$ x="$( trap 'err=$?;
>             echo >&2 "ERROR $err in $0 at line $LINENO, Aborting";
>             exit $err;' ERR
>       date
>       pwd
>       false
>       echo "I shan't"
> )"
ERROR 1 in bash at line 7, Aborting
BOOM
$ echo "$x"
Thu, Jan 10, 2019  8:35:57 AM
/c/Users/P2759474/repos/Old/deploy_microservices
$

Если бы внешняя оболочка имела такую ​​же или похожую ловушку, она также прервалась бы с другим сообщением. (Обычно полезно сделать сообщения разными.)

<Ч />

Если вам это просто не нравится, то в качестве неуклюжего обходного пути вы можете перенести данные в временный файл. Вот скрипт, который сделает это.

set -ex
{ pwd
  date
  false
  echo "will this happen?"
} > foo
x=$(<foo)
echo "$x"

Поместите это в сценарий, он успешно освобождается.

$: ./sete
+ pwd
+ date
+ false
$: echo $?
1

Я бы все еще использовал trap, но логика работает.
Я бы также использовал mktemp и ловушку для удаления температуры при выходе и т. Д., Но вы поняли.

0 голосов
/ 10 января 2019

Я не уверен, что понимаю причину того, что вы пытаетесь достичь, но если вы сможете немного подробнее рассказать, я мог бы вам помочь.

Я рекомендую прочитать эту фантастическую статью о том, что на самом деле происходит, и почему я не думаю, что вы хотите вызвать процесс без подоболочки.

Однако, чтобы попытаться ответить на то, что вы спросили:

Вы действительно не можете запустить команду внутри ${}, кроме как в предложении fallback для случая, когда значение не установлено (в POSIX sh или bash; может быть выполнимо в zsh, который допускает всевозможный синтаксис чуда).

Однако, вы можете позвонить cd так, если вы действительно хотели это:

cdr() {
   if (( $# )); then
     command cd "$@"
   else
     local home
     home=$(git rev-parse --show-toplevel 2>/dev/null) || home=$HOME
     command cd "$home"
   fi
}

Примечание

  • Использование функции позволяет нам проверять наш список аргументов, использовать логику ветвления, иметь локальные переменные, &c.
  • команда cd используется для вызова реальной реализации cd, а не для повторения.
...