例如,我可以使用子外壳来做到这一点:
VAL=$( do_something )
但是如何使用花括号实现相同的功能,以便命令不在子shell中执行?即这不起作用:
VAL={ do_something; }
TIA。
答案 0 :(得分:0)
我不确定我是否理解您要完成的工作的原因,但是如果您能详细说明,我可能会为您提供帮助。
我确实建议reading this fantastic write up关于到底发生了什么,以及为什么我不认为您想要来调用没有子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
实现,而不是递归。答案 1 :(得分:0)
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
和一个陷阱来删除退出时的温度,等等。。。但是您明白了。