我想在我的bash shell中提供一个要点,我该如何在一行中执行此操作?换句话说,我不想创建一个中间文件。
我尝试了这个,但它无法获取远程文件:
source <(curl -s -L https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash)
在Mac OSX 10.9上运行。
提前致谢。
答案 0 :(得分:1)
OS X默认仍然发布bash
3.2;在该版本中,source
命令似乎无法正常处理流程替换,可以通过简单的测试来证明:
$ source <(echo FOO=5)
$ echo $FOO
$
然而,相同的source
命令可以在bash
4.1或更高版本中工作(我没有4.0安装进行测试,发布说明似乎对此事保持沉默。)
答案 1 :(得分:1)
Apple发布了Bash的古老版本,Bash 3.2; Bash 4于5年前发布。以下是一些解决此问题的可能方法:
/etc/shells
,以便将其设置为shell,然后转到“系统偏好设置&gt;用户和组”,单击锁定以提供密码,以便进行更改,然后右键单击(双指单击/控制单击)您的用户选择“高级选项...”并在那里更改您的shell。如果您必须与OS X上附带的7岁Bash兼容,您可以保存文件并从那里获取文件。这是一个Bash函数示例,可以使这更容易:
function curlsource() {
f=$(mktemp -t curlsource)
curl -o "$f" -s -L "$1"
source "$f"
rm -f "$f"
}
curlsource https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
如果您绝对必须避免创建临时文件,并且必须在古老版本的Bash上运行,那么您可以做的最好就是读入一个字符串并评估结果。我尝试通过创建一个FIFO(命名管道)来模拟source <(cmd)
的效果,将cmd
的输出汇总到其中,然后用source
读取它,但什么也没得到。事实证明,看看Bash 3.2的源代码,source
只是将整个文件读入一个字符串,并在执行此操作之前检查文件大小。当您stat
时,FIFO返回大小0,因此source
愉快地分配长度为1的字符串(对于尾随空值),将0字节读入其中,并返回成功。因此,由于source
只是将整个文件读入字符串然后对其进行评估,因此您可以这样做:
eval "$(curl -s -L https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash)"
答案 2 :(得分:-2)
这适用于任何版本的bash且不创建任何文件。
source <<< "$(curl -s -L https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash)"