将别名动态加载到当前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启动后。。。

加载别名

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

看起来您想要

eval "$(script.pl)"

如果你想在交互式函数中使用它,你应该放在script.pl的完整路径中,这样无论你在哪个目录中,它都能工作;或者,当然,在你的PATH中有script.pl

如果你想把它放在.profile的一个函数中,你需要确保输出不会产生任何Bashmism,因为.profile与其他shell共享。也许可以将其放在.bash_profile中(但请注意,如果您创建了一个新的.bash_profile,这将在启动Bash时禁用读取.profile,因此您将希望在.bash_profile中显式执行此操作)。

例如,sourcefunction是(相当多余的IMHO)Bash扩展,它们在常规sh中不是有效的命令。

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

为什么不将load_aliases命令放入.bashrc中?

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

source <(script.pl)

这应该是可行的,尽管我无法摆脱一种挥之不去的怀疑,即我曾在source中遇到过一个问题,希望有一个真正的文件,而不是本质上的管道。