Linux shell中的命令组

时间:2011-08-08 08:35:13

标签: linux shell

假设我有这个shell脚本调用cpdir:

(cd $1 ; tar -cf - . ) | (cd $2 ; tar -xvf - )

当我运行它时,主shell应创建两个进程(子shell)以同时执行两组命令。但是,shell如何确保两个进程都更改为适当的目录,然后首先处理打包目录的内容并发送到第二个进程进行解包?

为什么没有竞争条件?虽然进程可以并行,但是每个进程的每个命令都按顺序执行是一个规则吗?

即。第一个进程将运行“cd $ 1”,然后第二个进程将运行“cd $ 2”(或者它应该与第一个进程同时执行?不确定),然后第一个进程将打包所有内容,最后发送到第二个进程。

虽然,我不知道关于焦油的一件小事:

tar -cf - .

我知道点(。)是当前目录的内容。但是,命令中的' - '是什么?

3 个答案:

答案 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”选项没有“ - ”值。 所以你的命令可能不便携。