技术解析

一个复制目录的命令组合,为什么工作目录没有变?
0
2021-07-27 04:01:20
idczone
读jar的manual的时候,发现一个复制目录的有趣命令
(cd dir1; jar c .) | (cd dir2; jar x)
它进入到目录dir1,打包所有文件到标准输出,通过管道传递,在目录dir2中,从标准输入解压文件。

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


每个管道都是一个新的子shell,除非在父进程修改了pwd,一个子shell是不能修改另一个子shell的pwd的
课后题:为什么这段代码里第一部分无法正常工作?
https://gist.github.com/4256080

因为在shell中圆括号"()"创建了子进程。
cd dir1; jar c .
这句是在子进程里进行的,执行到")"的时候会结束掉子进程,你当前这个进程的shell的PWD是没变的。
你可以试试这两个语句的区别:
(cd dir1; ls)
cd dir1; ls

呃。。。我怎么都正常工作呢呀。 bash / zsh 都是这样

课后题可以解释下吗?
为什么把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



我写代码时绝对抽风了…已经修改gist…


我还是不明白这里的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

管道符号后的部分是另一个子shell,read是能读到内容然后存入变量。但是随后这个shell就结束了,在父shell里读不到这个变量

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服