繁体   English   中英

如何在环境变量中捕获bash命令组(大括号)的输出

[英]How to capture output of bash command group (curly braces) in environment variable

例如,我可以使用一个子shell来做到这一点:

VAL=$( do_something )

但是如何用花括号实现相同的功能,因此命令不在子shell中执行? 即这不起作用:

VAL={ do_something; }

TIA。

我不确定我是否了解您要完成的工作的原因,但是如果您可以详细说明,我也许可以为您提供帮助。

我建议阅读这个梦幻般写了什么实际发生的,虽然,为什么我不认为你调用的过程没有一个子shell。

但是,尝试回答您的要求:

您实际上不能在${}内运行命令,除了在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实现,而不是递归。

set -e有点僵硬。 尝试类似

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

在阅读日志时,这将提供更多信息,并且您可以在子shell中放入类似的命令。 是的,这意味着将其添加到子外壳中...但是我经常在子外壳中调用的函数定义中执行此类操作。 效果很好。

正在使用:

$ 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和一个陷阱来删除退出时的温度,等等。。。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM