你如何在bash中获取文件(即gist)?

时间:2014-09-15 23:20:27

标签: macos bash shell

我想在我的bash shell中提供一个要点,我该如何在一行中执行此操作?换句话说,我不想创建一个中间文件。

我尝试了这个,但它无法获取远程文件:

source <(curl -s -L https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash)

在Mac OSX 10.9上运行。

提前致谢。

3 个答案:

答案 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年前发布。以下是一些解决此问题的可能方法:

  1. 安装MacPortsHomebrewpkgsrc并通过其中一个安装Bash;或者只是build and install it yourself from source。请记得将新安装的bash添加到/etc/shells,以便将其设置为shell,然后转到“系统偏好设置&gt;用户和组”,单击锁定以提供密码,以便进行更改,然后右键单击(双指单击/控制单击)您的用户选择“高级选项...”并在那里更改您的shell。
  2. 如果您必须与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
    
  3. 如果您绝对必须避免创建临时文件,并且必须在古老版本的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)"