使用〜/ .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将尝试仅执行第一个文件,并且可读取以下内容:

  1. .bash_profile
  2. .bash_login
  3. .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连接的情况下执行。

从这里部分撕开。