此命令正常工作:
$ bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
但是,我不明白如何将stable
作为参数传递给curl下载的shell脚本。这就是我无法在我自己的shell脚本中实现相同功能的原因 - 它给了我./foo.sh: 2: Syntax error: redirection unexpected
:
$ cat foo.sh
#!/bin/sh
bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
所以,问题是:这个stable
参数究竟是如何获取脚本的,为什么这个命令中有两个重定向,以及如何更改此命令以使其在我的脚本中工作?
答案 0 :(得分:12)
这与stable
无关,它与使用/bin/sh
的脚本相关,而不是bash
。 <()
语法在POSIX shell中不可用,其中包括在调用/bin/sh
时使用bash(在这种情况下,出于兼容性原因,它会关闭非标准功能)。
制作你的shebang线#!/bin/bash
。
< <()
成语:要明确发生了什么 - <()
被替换为一个文件名,该文件名指的是它运行的命令的输出;在Linux上,这通常是/dev/fd/##
类型的文件名。然后,运行< <(command)
正在获取该文件并将其指向您的stdin ...这与管道的行为非常接近。
要理解为什么这个习惯用法有用,请比较一下:
read foo < <(echo "bar")
echo "$foo"
到此:
echo "bar" | read foo
echo "$foo"
前者有效,因为读取是由同一个shell执行的,后来会回显结果。后者没有,因为读取是在子shell中运行的,该子shell是为了设置管道然后被销毁而创建的,因此后续的echo不再存在变量。
bash -s stable
: bash -s
表示要运行的脚本将在stdin上进入。然后,所有参数都被提供给$@
数组($1
,$2
等)中的脚本,因此当脚本输入时stable
变为$1
在stdin上运行。