2016-11-09 70 views
0

其实我对bash编程知之甚少。我读过管道允许我们使用程序的输出作为另一个的输入。然后,我预计一些语句,比如娄作品:如何与bash上的系统调用共享参数?

echo "newdirectory" | (mkdir && cd) 

mkdirecho接收outputed字符串作为其第一个参数,cd太之后。另一点是管道不能从左边的进程同步执行(是吗?)。

有一种方法可以通过bash上的系统调用重用参数吗?

特别是在这种情况下创建一个新的目录并改变它。

+1

不是普遍适用的,但您可以在问题的示例中使用'$ _'。 '$ _'扩展为前一个命令的* last *参数,所以'mkdir“newdirectory”&& cd“$ _”'将是等价的。 – chepner

+0

@chepner虽然nos的答案更加完整和教诲,但您的评论填补了我在寻找的内容。 –

回答

2

您可以为此使用变量,并将命令行参数传递给两个命令mkdir和cd,而不是尝试将数据传输到这些命令。

MYDIR="newdirectory" 
mkdir "$MYDIR" && cd "$MYDIR" 

有了这个,

echo "newdirectory" | (mkdir && cd) 

您同时连接的mkdir和CD的标准输入。一个程序/命令需要知道 是否应该从stdin读取数据,以及如何处理它。 mkdircd命令都没有这样做,他们希望你给他们命令行参数。

即使在命令可以从标准输入读取数据的情况下,在这种情况下,mkdir会消耗输入,并且不会为cd留下任何内容。在其他情况下,如果将相同的管道连接到多个命令/进程,则无法确定其中哪一个会读取数据。

此外,(mkdir && cd)中的圆括号表示这些命令在子shell中运行。但是cd仅影响当前shell,因此您将无法观察到cd命令的任何影响。

+0

感谢您的解释。 –

-1
mkdir `echo NewDirectorName` 

也使用程序的输出作为另一个程序的参数。

完成此操作的另一种方法是使用xargs命令。

echo NewDirectoryName | xargs mkdir 

@ nos的回答对你的情况来说是最正确的。

+0

您错过了OP希望一次指定的值与'mkdir' *和*'cd'一起使用的事实。命令替换在这里没有任何用处。 'xargs'用于使用不同的参数多次运行* one *命令,而不运行具有相同参数的* 2 *命令。 – chepner

+0

我说另一个答案是最正确的问题。我的答案仅供参考,因为它是相关的,语法与OP的代码示例更类似。 – nategoose