bash,如何将下载的文件(使用 curl)点源到 bash

bash, how to dot source a downloaded file (using curl) into bash

我有 .sh 文件,我想将其 dotsource 到我的 运行 环境中。这不起作用:

curl -s https://raw.githubusercontent.com/bla/bla/master/stuff.sh | bash

以上不起作用,即脚本 运行 ,但 stuff.sh 中的环境变量和内容未点源到 运行 环境中。我也试过:

. curl -s https://raw.githubusercontent.com/bla/bla/master/stuff.sh | bash
curl -s https://raw.githubusercontent.com/bla/bla/master/stuff.sh | bash source
curl -s https://raw.githubusercontent.com/bla/bla/master/stuff.sh | source bash

全部失败。希望知道如何做到这一点?

我不是 bash 专家,但如果您愿意接受一些缺点,最简单的方法就是不用管道。我相信当你分开下载和采购时应该是可能的:

prompt># curl -s https://raw.githubusercontent.com/bla/bla/master/stuff.sh > ./stuff.sh
prompt># . ./stuff.sh

来自 bash 手册 (man bash),在关于内置 source 命令的章节中:

Read and execute commands from filename [...]

没有提及标准输入作为应该获取的命令的可能来源。

但是,正如 hanshenrik 在他的回答中所述,您始终可以使用 进程替换 创建一个临时(并且在文件系统上不可见)文件,您可以将其提供给 source。语法为 <(list),其中 <(list) 扩展为由 bash 选择的唯一文件名,而 list 是一系列命令,其输出被放入该文件(但是文件没有出现在文件系统中)。

过程替换 记录在 bash 手册 (man bash) 中该标题下的一段中。

尝试

source <(curl -s https://raw.githubusercontent.com/bla/bla/master/stuff.sh)

我试过

curl -s https://raw.githubusercontent.com/bla/bla/master/stuff.sh | source /dev/stdin

但由于某种原因这不起作用,不知道为什么(有人知道吗?)