加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – “<<(command-here)”shell成语导致“重定向意外

发布时间:2020-12-15 22:39:09 所属栏目:安全 来源:网络整理
导读:这个命令工作正常: $bash -s stable (curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer) 但是,我不明白如何将完全稳定作为参数传递给curl下载的shell脚本.这就是我无法在我自己的shell脚本中实现相同功能的原因 – 它给了
这个命令工作正常:

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

但是,我不明白如何将完全稳定作为参数传递给curl下载的shell脚本.这就是我无法在我自己的shell脚本中实现相同功能的原因 – 它给了我./foo.sh:2:语法错误:重定向意外:

$cat foo.sh 
#!/bin/sh
bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

所以,问题是:这个稳定的参数究竟是如何进入脚本的,为什么这个命令中有两个重定向,以及如何更改此命令以使其在我的脚本中运行?

解决方法

关于“重定向意外”错误:

这与稳定无关,它与使用/ 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等),因此当运行stdin上的脚本运行时,stable变为$1.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读