我需要在 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 将尝试仅执行以下存在且可读的文件:
.bash_profile
.bash_login
.profile
如果找到其中一个文件但无法读取,则会导致错误。如果存在不是成立。
当使用该选项调用非交互式登录 shell 时,也会执行相同的过程--login
。
答案3
如果 Bash 以交互登录 shell 的形式执行,它只会查找.bash_login
或.profile
文件。如果以交互非登录 shell 的形式执行,它会读取.bashrc
。
通常是第二种情况,即当您运行gnome-terminal
bash 时,它会以非登录 shell 的形式运行。
这清楚地表明,如果您正在启动 Gnome,.bash_login
则不会执行。但是,如果您降低运行级别以直接启动到 bash,则成功登录后将执行相同的文件。
我认为.bash_login
在远程 SSH 连接的情况下也会执行。
部分摘自这里。
答案4
确保要运行的脚本是可执行的。运行chmod +x scriptname
即可。还要确保脚本以正确的 shebang 开头(#!/bin/bash
对于 shell 脚本)。最后,执行时使用所有完整路径,例如,/usr/bin/echo
而不是echo
仅仅以防脚本将在其中执行的环境与您习惯的环境不同。