假设我有一个名为cpdir的shell脚本:
(cd $1 ; tar -cf - . ) | (cd $2 ; tar -xvf - )当我运行它时,主shell应该创建两个进程(子shell)来并发执行这两组命令。但是,shell如何确保两个进程都更改到适当的目录,然后第一个进程将目录的内容打包并发送到第二个进程进行解包?
为什么没有竞态条件?尽管进程可以是并行的,但每个进程的每个命令都将按顺序执行,这是一条规则吗?
也就是说,第一个进程将运行"cd $1",然后第二个进程将运行"cd $2“(或者它应该与第一个进程同时执行?不确定),那么第一个进程将打包所有内容,最后发送到第二个进程。
不过,关于tar我不知道一件小事:
tar -cf - .我知道点(.)当前目录的内容。但是,命令中的'-‘是什么?
发布于 2011-08-08 16:44:31
您不需要使用cd,因为tar有一个-C选项,该选项告诉它切换到一个目录。因此,您可以简单地使用如下命令:
tar -C $1 -cvf - . | tar -C $2 -xvf --的意思是标准输入/标准输出。第一个连字符告诉tar写入标准输出。第二个命令告诉tar从标准输入读取数据。
因为-是缺省的,所以您甚至不需要指定它。您可以将命令缩短为:
tar -C $1 -c . | tar -C $2 -x发布于 2011-08-08 19:38:49
由于这些组在独立的进程中运行,因此先运行哪个cd命令并不重要:每个进程都有自己的工作目录。
因此,更改工作目录不会影响各自的其他进程。
发布于 2011-08-08 16:47:02
在您的情况下,您正在使用管道传输命令。你所期望的结果对我来说并不是很清楚。顺便说一下,对于这个"-f“选项,我的GNU没有"-”值。因此,您的命令可能不可移植。
https://stackoverflow.com/questions/6979498
复制相似问题