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

Gin*_*van 20 scripts login logout

当我在 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
Run Code Online (Sandbox Code Playgroud)

Ste*_*ski 28

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

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

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

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

另请参阅关于 superuser 的这个问题,以及这个 Bash howto(不要被 freeunix.dyndns.org:8088 地址吓倒——它仍然是一本质量很好的手册,我已经使用它多年了)。

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

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

要对此进行测试,请在每个文件中添加如下内容:.bashrc,.bash_profile.bash_login.

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"
Run Code Online (Sandbox Code Playgroud)

然后注销并重新登录。当您登录时,我敢打赌您只会看到“调试:我是 .bashrc”而不是“我是 .bash_profile”。如果是这样,则意味着您是“交互式非登录 shell”,这仅意味着 Bash 会调用.bashrc但不会调用.bash_profile. 有关为什么这些 dotfiles 是这样的信息,请参阅下面的 @Andrejs Cainikovs 的帖子和http://mywiki.wooledge.org/DotFiles

  • 这个答案解决了问题,我认为值得接受。 (4认同)

小智 8

登录 shell,无论它们是交互式的还是非交互式的,都可以读取并执行.profile

交互式 shell读取并执行.bashrc.

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

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

当 bash 作为交互式登录 shell被调用时,它从/etc/profile. 然后 Bash 将尝试仅执行第一个文件,并且可以读取以下内容:

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

如果找到这些文件之一但无法读取,则会导致错误。还有如果有任何错误发现。

当使用该--login选项调用非交互式登录 shell 时,将遵循相同的过程。


Huc*_*kle 0

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