使用〜/ .bash_login在登录时运行脚本
当我在Ubuntu中登录和注销时,我需要运行脚本。
我试着将脚本放在我的~/.bash_login
但它没有用。
有没有更好的位置,我可以运行我的脚本?
我的脚本位于/home/gsd/script/login.sh
,它是可执行文件。
编辑:
当我键入: /home/gsd/script/login.sh
并使用+ x设置时,我的脚本会运行
现在,我只有: ~/.bash_login
中的touch /home/gsd/test.txt
来测试。
永远不会创建文件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
如果.bash_profile存在,那么Bash将不会读取.bash_login(或.profile)。 在Bash手册的某些版本中描述了这种烦人的function,但并非全部。
.bash_profile
和.bash_login
是类似的,所以我建议你把你的命令放在.bash_profile
,因为它是常用的,而.bash_login
是相对未知的。 还要考虑将命令放在.bashrc
而不是.bash_profile
。 该手册描述了“交互式非登录shell”和“交互式登录shell”之间的区别,因此请务必阅读该部分。
GNU Bash参考手册4.1版:Bash启动文件说:
按顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取和执行命令。
另外在超级用户身上看到这个问题 ,以及这个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"
然后注销并再次登录。 当你登录时,我打赌你只会看到短语“DEBUG:我是.bashrc”而不是“我是.bash_profile”。 如果是这样,这意味着你是一个“交互式非登录shell”,这意味着Bash将调用.bashrc
而不是.bash_profile
。 有关这些dotfiles的原因,请参阅下面的@Andrejs Cainikovs的post和http://mywiki.wooledge.org/DotFiles
登录shell,无论它们是交互式还是非交互式,都会读取并执行.profile
交互式shell读取并执行.bashrc
。
通常你会看到/etc/profile
源.bashrc
– 因此.bashrc
所有设置也将在登录shell中生效,无论它是交互式还是非交互式。
shell的初始化脚本的执行顺序取决于shell是交互式还是非交互式,如果它是登录脚本则不相关。
当bash作为交互式登录shell调用时,它会从/etc/profile
读取并执行命令。 然后Bash将尝试仅执行第一个文件,并且可读取以下内容:
-
.bash_profile
-
.bash_login
-
.profile
如果找到其中一个文件但无法读取,则会导致错误。 如果找不到任何错误,则没有错误。
使用--login
选项调用非交互式登录shell时,将遵循相同的过程。
确保要运行的脚本是可执行的。 运行chmod +x scriptname
来执行此操作。 还要确保脚本以正确的shebang(shell脚本的#!/bin/bash
)开头。 最后,在执行时使用所有完整路径,例如/usr/bin/echo
而不是echo
只是因为脚本将执行的环境与您习惯的环境不同。
如果.bash_login
或.profile
文件作为交互式登录shell执行,则它仅查找.bash_login
或.profile
文件。 当它作为交互式非登录shell执行时,它会读取.bashrc
。
通常它是第二种情况,即当你运行gnome-terminal
bash作为非登录shell运行。
这清楚地表明,如果您正在启动Gnome,则不会执行.bash_login
。 但是如果你将运行级别降低到直接启动到bash,那么在成功登录时将执行相同的文件。
我假设.bash_login
也将在远程SSH连接的情况下执行。
从这里部分撕开。