如何在所有 tty shell 中设置别名?

如何在所有 tty shell 中设置别名?

我在 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_COMMANDprecmd实际上是在显示每个提示符之前执行的,因此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

相关内容