有关bash命令的用法

cyper 发布于 2015/06/28 17:51
阅读 2K+
收藏 0
我在这里这里分别看到了两种不同的有关bash的用法,
分别是
curl -sSL https://get.rvm.io | bash -s stable

bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )

对于第一种我大致搞清楚了它的用法,但是第二种我完全看不懂为什么要用两个< <,还有()是什么意思,最后是<(之间为什么不能有空格,谁能将第二条命令分步解释一下,十分感谢。

####我设计了一个简化版的例子####

其中test.sh的内容如下

#! /bin/sh
echo $@
echo $0,$1,$2



可以用上面给出的简版例子做实验。


加载中
0
rustacean
rustacean

这个链接应该对你有帮助

http://www.gnu.org/software/bash/manual/bash.html#Process-Substitution


cyper
cyper
谢谢,这个link非常有帮助,终于找到了对<(list)的解释,我先仔细看看。
0
crazyvv
crazyvv
() 是开一个子shell执行里面的命令.  <<是重定向 (相对的还有>>),意思就是把小括号里面的结果重定向给bash -s stable
命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

crazyvv
crazyvv
回复 @cyper : 因为你用bash -s...这个参数是如果有-s,或者选项处理之后没有别的参数,那么命令从标准输入读入。这个选项允许在调用交互式shell时设置位置变量。
crazyvv
crazyvv
回复 @cyper : 中间的空格应该是用作变量切割的
cyper
cyper
感谢回答,我知道<<是here document的意思,但是我这里的第二条命令的< <之间是有一个空格的,空格去掉就会报错。所以非常不解。正在看shell十三问
0
rustacean
rustacean
x 3.5.6 进程替换
如果系统支持命名管道(fifo)或能够以“/dev/fd”方式来命名打开的文件,则也就支持进程替换。进
程替换的语法形式是下面任意一种
<( 命令列表)
或者
>( 命令列表)
在运行时,进程的命令列表的输入和输出与一个命名管道或者“/dev/fd”目录里面的某个文件相关联。扩展
的结果是,该文件的名称作为一个参数转递给当前的命令。如果使用了>( 命令列表) 这种形式,对该文件
的写入就为命令列表提供了输入。如果使用了<( 命令列表) 这种形式,在需要得到命令列表的输出时,应
该去读取作为参数转递的文件。注意,< 或> 与左边括号之间不能有任何空格,否则这种结构就会被解释成
重定向。
如果系统支持,进程替换就和参数及变量扩展、命令替换、还有算术扩展同时进行。
0
cyper
cyper

引用来自“rustacean”的评论

这个链接应该对你有帮助

http://www.gnu.org/software/bash/manual/bash.html#Process-Substitution


形如<(command)的写法叫做process substitution知道这个叫法后就能找到大量的文章。比如这里:http://blog.chinaunix.net/uid-12072359-id-2960878.html,

可以把<(...)整体当做一个文件名,这个文件的内容就是()中脚本的执行结果,这样第二条命令简化为
bash -s stable <tmp.sh
其中tmp.sh的内容就是curl命令的执行结果,如果给tmp.sh传递参数需要放在-s选项后面,这里的stable就是传递经tmp.sh的第一个参数,可以用$1捕获。

0
crazyvv
crazyvv
哈哈.又学到了.
0
517723572
517723572
very good[79]
返回顶部
顶部