我.bashrc
将其移至服务器,以便可以通过以下方式下载并执行它wget
:
wget -O - http://xxx.github.io/dotfiles/bashrc | bash
它确实被执行了,但是该脚本中定义的任何函数和别名都不起作用。
有没有什么方法可以让我的功能定义得像脚本在本地运行一样?
答案1
作为garyjohn 在他的评论中描述,问题在于
获得 (选项和参数) | 重击至少在某些 shell 中(bash 显然是其中之一),管道 ( ) 会强制所有组件命令进入单独的进程。当您运行 时,新生成的 bash shell 进程是与您的主、父、交互式 shell 不同的进程。在左侧命令的输出中定义的任何函数、别名等都将在新的 bash shell 中定义 — 然后它将退出而不从您的终端/键盘读取任何命令,从而将您转回到原始 shell,没有函数等。
cmd1 | cmd2
something | 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