如何使从服务器下载(并执行)的 bash 脚本中定义的函数/别名发挥作用?

如何使从服务器下载(并执行)的 bash 脚本中定义的函数/别名发挥作用?

.bashrc将其移至服务器,以便可以通过以下方式下载并执行它wget

wget -O - http://xxx.github.io/dotfiles/bashrc | bash

它确实被执行了,但是该脚本中定义的任何函数和别名都不起作用。

有没有什么方法可以让我的功能定义得像脚本在本地运行一样?

答案1

作为garyjohn 在他的评论中描述,问题在于

获得  (选项和参数)  | 重击
至少在某些 shell 中(bash 显然是其中之一),管道 ( ) 会强制所有组件命令进入单独的进程。当您运行 时,新生成的 bash shell 进程是与您的主、父、交互式 shell 不同的进程。在左侧命令的输出中定义的任何函数、别名等都将在新的 bash shell 中定义 — 然后它将退出而不从您的终端/键盘读取任何命令,从而将您转回到原始 shell,没有函数等。cmd1 | cmd2something | bash

正如 garyjohn 所建议的,解决此问题并获取主 shell 中定义的函数、别名等的一种方法是将命令下载到文件中,然后获取它;例如,

wget -O-http://xxx.github.io/dotfiles/bashrc>.bashrc &&  复制代码

但这不是唯一的方法。诀窍是创建管道而不创建管道。做到这一点的诀窍是使用流程替代 (一个 bash 扩展命令替换)。 

  <(wget -O - http://xxx.github.io/dotfiles/bashrc)

将定义函数、别名等,而无需创建临时文件。


另一种方法是

wget -O-http://xxx.github.io/dotfiles/bashrc  |  /dev/标准输入
这对 bash 不起作用(因为它 . 命令),但它可能适用于某些其他 shell (例如,ksh)。


当然,标准警告适用:执行从网上下载的命令时要小心谨慎。如果您在本地网络上使用强化服务器,上述操作可能比较安全。否则,如果有人入侵网络服务器,您就为他在您的机器上运行任意命令打开了大门。将命令下载到文件中然后对其进行校验会更安全(尽管显然更繁琐)。然后,如果校验和正确,您就可以获取文件。

答案2

尝试这个:

wget -qO - https://raw.github.com/cescoferraro/dotfiles/master/src/os/setup.sh | xargs bash -c

相关内容