每次生成 shell 时运行脚本

每次生成 shell 时运行脚本

我需要一种方法来让脚本在所有用户下始终运行,并在生成任何新 shell 时自动启动。有什么想法吗?

答案1

...为什么?也许有更好的解决方案,所以如果你说为什么也许我们可以提出一些更合理的解决方案。请记住,shell 不仅由用户使用,还由许多系统进程使用。

无论如何,bash(默认 shell)在启动时将(但稍后见)执行一系列系统范围的脚本。shell 可以作为交互或非交互启动,也可以作为登录或非登录 shell 启动(man bash有关详细信息,请参阅并搜索“INVOCATION”)。

基本上,当用户在图形会话中的终端中启动 shell 时,bash 将被调用为交互式非登录 shell,并将执行/etc/bash.bashrc

当启动非登录 shell 的交互式 shell 时,如果 /etc/bash.bashrc 和 ~/.bashrc 存在,bash 将从这些文件读取并执行命令。可以使用 --norc 选项禁止此操作。--rcfile file 选项将强制 bash 从 file 而不是 /etc/bash.bashrc 和 ~/.bashrc 读取并执行命令。

因此您可以在此处添加命令。但请小心,此处的错误可能会导致您的系统很难恢复。

执行摘要(已测试)

编辑/etc/bash.bashrc并,在以下行之后

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

添加例如:

echo "Hello $USER, you started a new shell"

并从终端:

[romano:~] % bash
Hello romano, you started a new shell
romano@RRyS:~$

如果你想在这里运行脚本,请小心并仔细检查,例如

if [ -x /full/path/to/script ]; then 
     /full/path/to/script  # double check here 
fi

仔细检查是否/full/path/to/scriptbash在交互模式下调用,否则您将在这里遇到一个很好的无限循环。

警告:

这根本不是强制执行:其他 shell(zshtcshdash)的行为会有所不同,并使用不同的文件。显然,任何用户都可以使用以下命令调用 shell

bash --norc --noprofile 

并跳过脚本文件。


14.04 中甚至有一个示例/etc/bash.bashrc(可能是 Ubuntu 切换到时留下的遗留问题sudo...)提示用户使用sudo而不是以 root 身份登录:

# sudo hint
if [ ! -e "$HOME/.sudo_as_admin_successful" ] && [ ! -e "$HOME/.hushlogin" ] ; then
    case " $(groups) " in *\ admin\ *)
    if [ -x /usr/bin/sudo ]; then
        cat <<-EOF
        To run a command as administrator (user "root"), use "sudo <command>".
        See "man sudo_root" for details.

        EOF
    fi
    esac
fi

...但这是代码考古学;-)。

答案2

我不确定你说的‘一直运行’是什么意思,所以我无法回答这一部分,但可以回答其余部分。

https://help.ubuntu.com/community/EnvironmentVariables在‘系统范围的环境变量’部分下有很好的解释。

但您需要知道的是,登录 shell 和交互式非登录 shell 由不同的文件控制。因此,如果您希望脚本在所有 shell 启动时运行,则需要在两个地方获取脚本,或将其放在两个地方。

在执行任何登录 shell 时运行脚本:

引用上述来源:每当进入 bash 登录 shell 时(例如从控制台或通过 ssh 登录时),/etc/profile.d 目录中带有 .sh 扩展名的文件都会被执行,并且当桌面会话加载时,DisplayManager 也会执行这些文件。

因此,只需将脚本放在 /etc/profile.d 目录中,并为其添加 .sh 扩展名。

在执行任何交互式非登录 shell 时运行脚本:

与以前几乎相同,只是这次它不是一个目录,而是一个文件。

执行任何交互式非登录 shell 时,都会调用 /etc/bash.bashrc。这意味着您可以将脚本的内容直接放在 /etc/bash.bashrc 中,也可以从那里调用脚本。如果您的脚本位于 /etc/myscript.sh 中,您可以通过将 添加source /etc/myscript.sh到 /etc/bash.bashrc 文件来调用它。

相关内容