urain39 / stuff

Noting here.
1 stars 0 forks source link

shell 解决管道作用域限制(subshell)问题 #124

Open urain39 opened 2 years ago

urain39 commented 2 years ago

在 shell 中,管道后面如果是一个 shell 语句,那么它将会在 subshell 中执行。subshell 会继承当前 shell 的状态,但不会更改当前 shell 状态。这一点就非常坑人了。

举个例子,假设我们有下面的代码:

text="123 abc"
echo "$text"| read -r num _
echo "$num"

那么它的最终输出结果会是空。

为了解决这个问题,我们需要将管道改为重定向,让处理语句在当前 shell 里执行:

text="123 abc"
read -r num _ << EOT
$text
EOT
echo "$num"

这里的代码是兼容 POSIX sh 的,因此绝大多数 shell 都能用。

同理,这种方法也可以用来重定向变量中的内容。配合内建命令 read 与 IFS 对行和列进行分割,效率会比调用外部命令 awk 高上不少。