首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux shell中的命令组

Linux shell中的命令组
EN

Stack Overflow用户
提问于 2011-08-08 16:35:13
回答 3查看 1K关注 0票数 2

假设我有一个名为cpdir的shell脚本:

代码语言:javascript
复制
(cd $1 ; tar -cf - . ) | (cd $2 ; tar -xvf - )

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

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

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

不过,关于tar我不知道一件小事:

代码语言:javascript
复制
tar -cf - .

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-08 16:44:31

您不需要使用cd,因为tar有一个-C选项,该选项告诉它切换到一个目录。因此,您可以简单地使用如下命令:

代码语言:javascript
复制
tar -C $1 -cvf - . | tar -C $2 -xvf -

-的意思是标准输入/标准输出。第一个连字符告诉tar写入标准输出。第二个命令告诉tar从标准输入读取数据。

因为-是缺省的,所以您甚至不需要指定它。您可以将命令缩短为:

代码语言:javascript
复制
tar -C $1 -c . | tar -C $2 -x
票数 4
EN

Stack Overflow用户

发布于 2011-08-08 19:38:49

由于这些组在独立的进程中运行,因此先运行哪个cd命令并不重要:每个进程都有自己的工作目录。

因此,更改工作目录不会影响各自的其他进程。

票数 1
EN

Stack Overflow用户

发布于 2011-08-08 16:47:02

在您的情况下,您正在使用管道传输命令。你所期望的结果对我来说并不是很清楚。顺便说一下,对于这个"-f“选项,我的GNU没有"-”值。因此,您的命令可能不可移植。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6979498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档