作者回复: 1 内部命令在子进程中的执行行为不会影响到父进程,并非执行结果的显示 2 history | wc -l 这条命令是把history的标准输出作为了wc的标准输入(这是管道的默认功能),wc执行的时候会创建子进程,并把标准输出指向父进程(当前shell)的标准输出,所以看到输出结果是63 3 对变量赋值操作 echo 123 | read a ,再查看 a变量的值 echo $a 是空值,这才是需要避免的子进程没有把变量返回给父进程的错误示例。
作者回复: 这个问题要分开来为你解释。 外部命令会产生子进程,管道符同样会产生子进程。内部命令在shell当前进程运行,不会产生子进程。 在管道符两端放置内部命令,相当于打开了新的子shell。内部命令执行结束之后,子shell也会跟着一起结束。因此在管道符两端放置内部命令,对当前的shell是不生效的。
作者回复: 线程的最大好处是把执行时间长的任务切换到后台去,对io密集型应用执行效率有很大帮助,但是管道的目的是顺序执行+通讯,所以管道没设计成多线程方式啊
作者回复: a并非读不到值,是在子进程读取了值,又回到父进程 这里类似下面操作: shell> bash shell> a=123 shell> exit shell>
作者回复: 1 试一下 单独运行cat 和 cat <<< "hello" ,你会发现cat如果有输入并正常结束,是不会产生阻塞的;也就是执行ps命令的时候,cat命令已经执行结束了,自然看到cat进程。 2 管道符会产生子进程,cd /var 相当于执行bash 然后运行了cd /var 再执行了exit ,所以当前shell下“没起作用”
作者回复: 除非文件已经被其他程序打开,比如记事本打开了旧的文件,否则无法恢复
作者回复: 执行之前先使用unset b,是否父进程提前为b做了赋值? 另外vscode我这里没有复现环境,考虑用标准的RHEL7试一下