使用 ~/.bash_login 登录时运行脚本

使用 ~/.bash_login 登录时运行脚本

我需要在 Ubuntu 上登录和注销时运行一个脚本。

我尝试将脚本放入我的~/.bash_login,但没有成功。

有没有更好的位置可以运行我的脚本?

我的脚本位于/home/gsd/script/login.sh并且它是可执行的。

编辑:

当我输入时我的脚本会运行:/home/gsd/script/login.sh并且它用 +x 设置

现在,我只有:touch /home/gsd/test.txt在进行~/.bash_login测试。

文件 test.txt 从未被创建

编辑2:

gsd@laptop:~$ ll ~/.bash*
-rw------- 1 gsd gsd 38639 2012-01-25 17:25 .bash_history
-rw-r--r-- 1 gsd gsd    29 2012-01-25 15:22 .bash_login
-rw-r--r-- 1 gsd gsd   220 2011-11-03 19:22 .bash_logout
-rw-r--r-- 1 gsd gsd  3136 2011-11-04 08:00 .bashrc

答案1

如果 .bash_profile 存在,则 Bash 将不会读取 .bash_login(或 .profile)。这个烦人的功能在 Bash 手册的某些版本中有描述,但不是全部。

.bash_profile.bash_login是类似的,所以我建议你将命令放在 中.bash_profile,因为它是常用的并且.bash_login相对不为人所知。也可以考虑将命令放在 中.bashrc而不是 中.bash_profile。手册描述了“交互式非登录 shell”和“交互式登录 shell”之间的区别,因此请务必阅读该部分。

GNU Bash 参考手册 4.1 版:Bash 启动文件说:

按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从中读取和执行命令第一个存在的 并且可读。

另请参阅关于超级用户的这个问题, 和这个 Bash 指南(不要被 freeunix.dyndns.org:8088 地址所阻碍——它仍然是一本高质量的手册,我已经使用它好几年了)。

更新,因为您说您没有.bash_profile。

听起来你没有使用所谓的“交互式非登录 shell”(有关详细说明,请参阅 Bash 手册)。

为了测试这一点,在每个文件中添加如下内容:.bashrc.bash_profile.bash_login

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

然后注销并再次登录。登录后,我敢打赌你只会看到短语“DEBUG:我是 .bashrc”,而不会看到“我是 .bash_profile”。如果是这样,则意味着你是一个“交互式非登录 shell”,这仅仅意味着 Bash 会调用.bashrc但不会.bash_profile。有关这些点文件为何如此的信息,请参阅下面的@Andrejs Cainikovs 的帖子和http://mywiki.wooledge.org/DotFiles

答案2

登录 shell,无论它们是否交互的或者非交互式读取并执行.profile

交互式 shell读取并执行.bashrc

通常您会看到/etc/profile.bashrc- 因此所做的所有设置.bashrc也将在登录 shell 中生效,无论它是交互式的还是非交互式的。

Shell 的初始化脚本的执行顺序取决于 shell 是交互式的还是非交互式的,而与其是否是登录脚本无关。

当 bash 被调用为交互式登录外壳它从 读取并执行命令/etc/profile。然后 Bash 将尝试仅执行以下存在且可读的文件:

  1. .bash_profile
  2. .bash_login
  3. .profile

如果找到其中一个文件但无法读取,则会导致错误。如果存在不是成立。

当使用该选项调用非交互式登录 shell 时,也会执行相同的过程--login

答案3

如果 Bash 以交互登录 shell 的形式执行,它只会查找.bash_login.profile文件。如果以交互非登录 shell 的形式执行,它会读取.bashrc
通常是第二种情况,即当您运行gnome-terminalbash 时,它会以非登录 shell 的形式运行。

这清楚地表明,如果您正在启动 Gnome,.bash_login则不会执行。但是,如果您降低运行级别以直接启动到 bash,则成功登录后将执行相同的文件。
我认为.bash_login在远程 SSH 连接的情况下也会执行。

部分摘自这里

答案4

确保要运行的脚本是可执行的。运行chmod +x scriptname即可。还要确保脚本以正确的 shebang 开头(#!/bin/bash对于 shell 脚本)。最后,执行时使用所有完整路径,例如,/usr/bin/echo而不是echo仅仅以防脚本将在其中执行的环境与您习惯的环境不同。

相关内容