1
yegle 2012-12-11 13:19:48 +08:00 1
每个管道都是一个新的子shell,除非在父进程修改了pwd,一个子shell是不能修改另一个子shell的pwd的
课后题:为什么这段代码里第一部分无法正常工作? https://gist.github.com/4256080 |
2
tmtsrc46 2012-12-11 13:26:11 +08:00 1
因为在shell中圆括号"()"创建了子进程。
cd dir1; jar c . 这句是在子进程里进行的,执行到")"的时候会结束掉子进程,你当前这个进程的shell的PWD是没变的。 你可以试试这两个语句的区别: (cd dir1; ls) cd dir1; ls |
4
atom OP @yegle 课后题可以解释下吗?
为什么把echo 改为 cat就可以呢? abs-book里面有提到read读取管道的问题,但对于cat为什么可以,好像没有一个清晰的解释。或者是我理解力不够。 Example 15-8. Problems reading from a pipe http://tldp.org/LDP/abs/html/internal.html http://tldp.org/LDP/abs/html/gotchas.html#BADREAD0 |
6
atom OP @yegle
我还是不明白这里的trick是为什么 ”Piping output to a read, using echo to set variables will fail. Yet, piping the output of cat seems to work.“ http://tldp.org/LDP/abs/html/internal.html |
7
yegle 2012-12-14 14:54:40 +08:00
@atom 管道符号后的部分是另一个子shell,read是能读到内容然后存入变量。但是随后这个shell就结束了,在父shell里读不到这个变量
|