作为参考,这是ksh93技巧。(需要非古代版本)。function out { echo stdout echo stderr >&2}x=${ { y=$(out); } 2>&1; }typeset -p x y # Show the values产生x=stderry=stdout该${ cmds;}语法只是一个命令替换不创建一个子shell。这些命令在当前的shell环境中执行。开头的空间很重要({是一个保留字)。内部命令组的Stderr被重定向到stdout(因此它适用于内部替换)。接下来,stdout out被分配给y,并且重定向的stderr被捕获x,而没有通常丢失y到命令替换的子shell。在其他shell中是不可能的,因为捕获输出的所有构造都需要将生成器放入子shell中,在这种情况下,它将包括赋值。更新:现在也受mksh支持。