"< ≤(命令这里)" shell成语导致"重定向意外"

时间:2012-03-13 14:45:59

标签: bash shell redirect stdin

此命令正常工作:

$ 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参数究竟是如何获取脚本的,为什么这个命令中有两个重定向,以及如何更改此命令以使其在我的脚本中工作?

1 个答案:

答案 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上运行。