我在 shell tt2 中设置了一个别名,但它在其他 tty shell 中不起作用,知道如何创建系统范围的别名吗?
答案1
无需费力,只需更改文件即可/etc/bashrc
。我知道,你可能认为它只适用于当前的 tty,但没有伙伴,它可以工作。只需退出一次,然后使用您喜欢的任何用户重新登录即可。您甚至可以通过 SSHing 或其他方式进行测试。
但如果它不起作用 - 虽然我相信它起作用 - 阅读此文件,这可以帮助你很多:/etc/profile
答案2
您无法强制 shell 进程从外部使用新别名,因此加载新别名的请求必须来自每个终端上的每个 shell 实例。
您可以通过将代码放入 bash 在每个命令之后执行代码PROMPT_COMMAND
多变的。所以你可以使用类似的东西
reload_aliases () {
. ~/.bash_aliases
}
PROMPT_COMMAND="$PROMPT_COMMAND
reload_aliases"
并通过编辑来定义别名,~/.bash_aliases
而不是在一个 shell 中键入它们。请注意,该PROMPT_COMMAND
变量仅在运行命令后执行,因此您需要运行一个命令(例如:
,这是一个不执行任何操作的命令);空命令行是不够的。
您还可以覆盖该alias
命令以自动附加到.bash_aliases
文件,但我建议不要这样做,因为当您只想为一个 shell 定义特定于任务的别名时,这会造成很大的破坏。您可以使用该命令在当前 shell 中附加特定别名及其定义alias ALIASNAME >>~/.bash_aliases
(替换ALIASNAME
为别名的实际名称)。
在 zsh 中,您可以使用precmd
而不是 bash 的PROMPT_COMMAND
.与 bash 不同的是PROMPT_COMMAND
,precmd
实际上是在显示每个提示符之前执行的,因此Enter按提示符就足以调用它。即使 zsh 也无法在没有用户干预的情况下重新加载别名文件。
或者,您可以通过设置使 shell 对信号做出反应trap
。 shell 不使用信号 SIGUSR1,因此您可以使用它来加载您的别名:
trap 'reload_aliases' USR1
(reload_aliases
功能如上。)采用这种方式,需要向所有的发送SIGUSR1信号交互的当您编辑别名列表时您的 shell 的实例。请务必不要将信号发送到脚本,因为此信号的默认操作是杀死 shell!没有简单的方法来列出交互式 shell;以下特定于 Linux 的脚本很接近,但请注意,它可能会由于竞争条件而意外关闭不相关的进程。
for pid in $(pgrep bash); do
if cd "/proc/$pid" 2>/dev/null &&
[ -c fd/0 ] &&
grep '^SigCgt: .............[2367abef]..$' status; then
kill -USR1 "$pid"
fi
done