一个复制目录的命令组合,为什么工作目录没有变?

2012-12-11 11:28:32 +08:00
 atom
读 jar 的 manual 的时候,发现一个复制目录的有趣命令
(cd dir1; jar c .) | (cd dir2; jar x)
它进入到目录 dir1 ,打包所有文件到标准输出,通过管道传递,在目录 dir2 中,从标准输入解压文件。

我不明白的是,为什么执行命令前后,工作目录(pwd)会没有变?
比如,cd 到 dir1 后,为什么不用先 cd ../dir2 ?

3642 次点击
所在节点    Linux
7 条回复
yegle
2012-12-11 13:19:48 +08:00
每个管道都是一个新的子shell,除非在父进程修改了pwd,一个子shell是不能修改另一个子shell的pwd的

课后题:为什么这段代码里第一部分无法正常工作?
https://gist.github.com/4256080
tmtsrc46
2012-12-11 13:26:11 +08:00
因为在shell中圆括号"()"创建了子进程。
cd dir1; jar c .
这句是在子进程里进行的,执行到")"的时候会结束掉子进程,你当前这个进程的shell的PWD是没变的。
你可以试试这两个语句的区别:
(cd dir1; ls)
cd dir1; ls
bitsmix
2012-12-11 14:08:32 +08:00
@yegle 呃。。。我怎么都正常工作呢呀。 bash / zsh 都是这样
atom
2012-12-12 13:49:25 +08:00
@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
yegle
2012-12-12 15:10:46 +08:00
@bitsmix
@atom
我写代码时绝对抽风了…已经修改gist…
atom
2012-12-13 14:49:42 +08:00
@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
yegle
2012-12-14 14:54:40 +08:00
@atom 管道符号后的部分是另一个子shell,read是能读到内容然后存入变量。但是随后这个shell就结束了,在父shell里读不到这个变量

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/54608

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX