tags: [bash, bash-tricks, subshell] —

Bash 的 subshell 与子进程

subshell 也是子进程,区别在于 subshell 继承父进程的变量,而子进程只能继承父进程 export 的变量。

unset -v a; a=1
unset -v b; export b=2
(echo "in subshell: a=$a b=$b")
sh -c 'echo "in the child shell: a=$a b=$b"'

输出结果是

in subshell: a=1 b=2
in the child shell: a= b=2

参考 https://mywiki.wooledge.org/SubShell

subshell 与子进程都无法修改父进程的变量

k=(1 2 3)
( echo "${k[@]}" )         # print 1 2 3
( k[0]=4; echo "${k[@]}" ) # print 4 2 3
echo "${k[@]}"             # print 1 2 3

a=1
( a=2 )
echo $a  # print 1

创建 subshell 的方法

  • (cmd)
  • cmd1 | cmd2
  • $(cmd)`cmd`
  • cmd &
  • <(cmd) or >(cmd)

创建子进程的方法

在 shell script 里直接执行程序。