假设我有这个shell脚本调用cpdir:
(cd $1 ; tar -cf - . ) | (cd $2 ; tar -xvf - )
当我运行它时,主shell应创建两个进程(子shell)以同时执行两组命令。但是,shell如何确保两个进程都更改为适当的目录,然后首先处理打包目录的内容并发送到第二个进程进行解包?
为什么没有竞争条件?虽然进程可以并行,但是每个进程的每个命令都按顺序执行是一个规则吗?
即。第一个进程将运行“cd $ 1”,然后第二个进程将运行“cd $ 2”(或者它应该与第一个进程同时执行?不确定),然后第一个进程将打包所有内容,最后发送到第二个进程。
虽然,我不知道关于焦油的一件小事:
tar -cf - .
我知道点(。)是当前目录的内容。但是,命令中的' - '是什么?
答案 0 :(得分:4)
您不需要使用cd
,因为tar有一个-C
选项,告诉它更改为目录。所以你可以简单地使用如下命令:
tar -C $1 -cvf - . | tar -C $2 -xvf -
-
表示stdin / stdout。第一个连字符告诉tar
写入stdout。第二个告诉tar
从stdin读取。
由于-
是默认值,因此您甚至不需要指定它。您可以将命令缩短为:
tar -C $1 -c . | tar -C $2 -x
答案 1 :(得分:1)
当这些组在独立进程中运行时,哪个cd
命令首先运行并不重要:每个进程都有自己的工作目录。
因此,更改工作目录不会影响其他进程。
答案 2 :(得分:0)
您正在管理您的案例中的命令。你期望的结果对我来说不是很清楚。 顺便说一句,我的GNU tar对于这个“-f”选项没有“ - ”值。 所以你的命令可能不便携。