• blackpiglet
    2019-09-02
    最后关于内部命令结果不会返回给父进程这块没理解,我用的 history (内部命令) 接 wc 来查看一共有多少条历史记录,看起来是可以正常工作,并且结果也会返回给父 shell。

    $ history | wc -l
    $ 63

    作者回复: 1 内部命令在子进程中的执行行为不会影响到父进程,并非执行结果的显示
    2 history | wc -l 这条命令是把history的标准输出作为了wc的标准输入(这是管道的默认功能),wc执行的时候会创建子进程,并把标准输出指向父进程(当前shell)的标准输出,所以看到输出结果是63
    3 对变量赋值操作 echo 123 | read a ,再查看 a变量的值 echo $a 是空值,这才是需要避免的子进程没有把变量返回给父进程的错误示例。

     2
     2
  • 极客时间
    2019-12-31
    老师为什么不是产生子线程呢?

    作者回复: 线程的最大好处是把执行时间长的任务切换到后台去,对io密集型应用执行效率有很大帮助,但是管道的目的是顺序执行+通讯,所以管道没设计成多线程方式啊

     1
     1
  • John
    2019-09-26
    [root@localhost ~]# cd /var | cat | ps -f

    执行这个命令的时候, 会显示:
    UID PID PPID C STIME TTY TIME CMD
    root 9769 29848 0 13:04 pts/2 00:00:00 ps -f
    root 29848 29751 0 12:17 pts/2 00:00:00 -bash

    问题:
    1. 为啥cat命令没有打印出pid出来。 单独cat | ps -f会打印出来
    2. 为啥路径还是在~, 而不是在/var. cd这个内部命令没有起作用么?
    展开

    作者回复: 1 试一下 单独运行cat 和 cat <<< "hello" ,你会发现cat如果有输入并正常结束,是不会产生阻塞的;也就是执行ps命令的时候,cat命令已经执行结束了,自然看到cat进程。

    2 管道符会产生子进程,cd /var 相当于执行bash 然后运行了cd /var 再执行了exit ,所以当前shell下“没起作用”

     1
    
  • 胡波 allenhu
    2019-09-06
    老师, 我的电脑上执行:.
    vscode echo 1234 | read b
    ➜ .vscode echo $b
    1234

    作者回复: 执行之前先使用unset b,是否父进程提前为b做了赋值?
    另外vscode我这里没有复现环境,考虑用标准的RHEL7试一下

    
    
我们在线,来聊聊吧