Open urain39 opened 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 高上不少。
在 shell 中,管道后面如果是一个 shell 语句,那么它将会在 subshell 中执行。subshell 会继承当前 shell 的状态,但不会更改当前 shell 状态。这一点就非常坑人了。
举个例子,假设我们有下面的代码:
那么它的最终输出结果会是空。
为了解决这个问题,我们需要将管道改为重定向,让处理语句在当前 shell 里执行:
这里的代码是兼容 POSIX sh 的,因此绝大多数 shell 都能用。
同理,这种方法也可以用来重定向变量中的内容。配合内建命令 read 与 IFS 对行和列进行分割,效率会比调用外部命令 awk 高上不少。