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

Chi*_*Abs 5 shell

我在 shell tt2 中设置了一个别名,但它在其他 tty shell 中不起作用,知道如何创建系统范围的别名吗?

Gil*_*il' 3

您无法强制 shell 进程从外部使用新别名,因此加载新别名的请求必须来自每个终端上的每个 shell 实例。

您可以通过将代码放入变量中来使 bash 在每个命令之后执行代码PROMPT_COMMAND。所以你可以使用类似的东西

reload_aliases () {
  . ~/.bash_aliases
}
PROMPT_COMMAND="$PROMPT_COMMAND
reload_aliases"
Run Code Online (Sandbox Code Playgroud)

并通过编辑来定义别名,~/.bash_aliases而不是在一个 shell 中键入它们。请注意,该PROMPT_COMMAND变量仅在运行命令后执行,因此您需要运行一个命令(例如:,这是一个不执行任何操作的命令);空命令行是不够的。

您还可以覆盖该alias命令以自动附加到.bash_aliases文件,但我建议不要这样做,因为当您只想为一个 shell 定义特定于任务的别名时,这会造成很大的破坏。您可以使用该命令在当前 shell 中附加特定别名及其定义alias ALIASNAME >>~/.bash_aliases(替换ALIASNAME为别名的实际名称)。

在 zsh 中,您可以使用precmdbash 的PROMPT_COMMAND. 与 bash 不同的是PROMPT_COMMANDprecmd实际上是在显示每个提示符之前执行的,因此按Enter提示符就足以调用它。即使 zsh 也无法在没有用户干预的情况下重新加载别名文件。

或者,您可以通过设置 .shell 来使您的 shell 对信号做出反应trap。shell 不使用信号 SIGUSR1,因此您可以使用它来加载您的别名:

trap 'reload_aliases' USR1
Run Code Online (Sandbox Code Playgroud)

reload_aliases函数如上。)使用这种方法,当您编辑别名列表时,您需要向 shell 的所有交互式实例发送 SIGUSR1 信号。请务必不要将信号发送到脚本,因为此信号的默认操作是杀死 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
Run Code Online (Sandbox Code Playgroud)