将别名动态加载到当前 shell

Dynamically loading aliases into current shell

没能破解这个,欢迎大家帮忙。

我有一个小脚本,它执行一些逻辑,然后尝试为我创建别名以加载到我的 shell。我已经尝试了几种不同的方法来做到这一点,但没有比这更好的方法了。这感觉就像一个讨厌的黑客。

 script.pl > new_aliases.txt && source new_aliases.txt && rm new_aliases.txt

理想情况下,这发生在 .bashrc 文件中,因此它会在 shell 启动时加载。我能做的最好的事情就是将上面的行包装在 shell 函数中,然后在 shell 开始后手动调用它。

在我的 .profile 里面

function load_aliases () {
    script.pl > new_aliases.txt && source new_aliases.txt && rm new_aliases.txt
}

然后 shell 开始后...

load_aliases

就像我说的那样,这是我想要的,但是 1) 它太丑了 2) 手动。

看起来你想要

eval "$(script.pl)"

如果你想在交互功能中使用它,你应该输入 script.pl 的完整路径,这样无论你在哪个目录中它都可以工作;或者,当然,在您的 PATH.

中添加 script.pl

如果您想将其放入 .profile 的函数中,您需要确保输出不会产生任何 Bash 主义,因为 .profile 与其他贝壳。也许把它放在 .bash_profile 中(但请注意,如果你创建一个新的 .bash_profile,这会在你开始 Bash 时禁用读取 .profile,所以你会想要明确地这样做然后从你的.bash_profile)。

例如,sourcefunction 是(相当多余的恕我直言)Bash 扩展,它们在常规 sh.

中不是有效命令

当然,关于 eval 的常见警告适用,但这并不比您已经在做的更不安全。

你为什么不把 load_aliases 命令放到你的 .bashrc 中?

除了eval的解决方案,还可以使用进程替换,把script.pl的输出当成一个文件。

source <(script.pl)

这应该可行,尽管我无法摆脱挥之不去的怀疑,即我 运行 遇到过一次问题 source 期待一个真实的文件,而不是本质上是管道的文件。