【问题标题】:bash, how to dot source a downloaded file (using curl) into bashbash,如何将下载的文件(使用 curl)点源到 bash
【发布时间】:2021-03-05 07:09:31
【问题描述】:

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

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

上面的不行,即脚本运行,但是stuff.sh里面的环境变量和东西并没有dotsourced到运行环境中。我也试过了:

. 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

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

【问题讨论】:

  • 使用source <(command)
  • 谢谢,但似乎无法让它工作:$ source < (curl -s https://raw.githubusercontent.com/user/bla/master/stuff.sh | bash) => bash: syntax error near unexpected token ('` $ source < (curl -s https://raw.githubusercontent.com/user/bla/master/stuff.sh) => bash: syntax error near unexpected token ('` `$ source raw.githubusercontent.com/user/bla/master/stuff.sh | bash => bash: curl : 没有这样的文件或目录``
  • 之间不能有空格

标签: bash github curl dot-source


【解决方案1】:

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

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

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

从文件名 [...] 读取和执行命令

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

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

进程替换记录在 bash 手册 (man bash) 中该确切标题下的段落中。

【讨论】:

  • 好的,太好了,我(错误地)认为我可能必须在下载文件后对文件进行 chmod,然后才能运行它,但这有效。完美。
  • kvantour 的解决方案更好,这种方法有缺点:如果您有另一个脚本也使用文件名“stuff.sh”来做某事会发生什么?这将删除一些其他脚本。或者如果文件系统由于某种原因是只读的会发生什么?这将失败。 kvantour 的解决方案不会删除任何内容,即使它是只读文件系统也能正常工作
  • 我相信这取决于具体情况,哪种解决方案更好。例如,OP 可能不止一次需要该文件;然后将其存储起来比一次又一次地下载要好。
  • 我实际上想做所有这些,有时我想覆盖文件,有时我会做一个[ -f ./file ] 来检查,有时我只想创建而不创建一个文件,所以非常有帮助,谢谢。
【解决方案2】:

试试

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

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

【讨论】:

  • 对于未来的读者,此答案中首先显示的构造称为 进程替换 并记录在 bash 手册 (man bash) 的段落中,其中的标题正是该标题。
  • 第二个结构不起作用,因为source /dev/stdin 在子shell 中运行。
猜你喜欢
  • 2010-11-29
  • 1970-01-01
  • 2017-10-08
  • 2023-03-08
  • 2018-05-30
  • 2014-02-23
  • 2015-06-16
  • 2016-09-15
  • 2020-06-21
相关资源
最近更新 更多