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


15

我在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

.bash_login是否具有正确的权限?ls -l .bash_login返回什么?
santiagozky 2012年

你也有~/.bash_profile吗?
enzotib 2012年

-rw-r--r-- 1 gsd gsd 313 2012-01-22 11:56 .bash_login
吉诺·沙利文

1
chmod +x .bash_login
2012年

1
不需要chmod +x .bash_login(在.bash_login上设置可执行位)。Bash手册在这方面有些混乱,但是Bash并不像shell脚本那样执行.bash_login。它会读取文件,然后执行其中的命令(您可以通过运行来执行类似操作source ~/.bash_login)。
Stefan Lasiewski,2012年

Answers:


20

如果.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,并从第一个存在 且可读的命令中读取并执行命令。

另请参阅有关超级用户的问题以及有关Bash的方法(不要被freeunix.dyndns.org:8088地址所吓倒,它仍然是一本质量不错的手册,我已经使用了很多年)。

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

听起来您好像没有使用所谓的“交互式非登录外壳程序”(有关详细说明,请参见Bash手册)。

为了验证这一点,添加类似下面的每个文件:.bashrc.bash_profile.bash_login

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

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


我更新了我的问题,我没有bash_profile
Gino Sullivan'1

好的,因为您之前说过“是的,我有一个bash个人资料”。
Stefan Lasiewski'1

是的,我先将其删除,但结果相同
Gino Sullivan

3
这个答案解决了问题,我认为值得接受。
Marius Butuc 2012年

1
还要注意,这些bash文件仅在登录到外壳程序(通过Terminal,ssh等)时运行,而不是在登录GUI时运行!
mivk 2012年

6

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

交互式外壳读取并执行.bashrc

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

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

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

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

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

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


1
AFAIK,.profile仅当用户使用图形界面登录时才读取和执行文件。否则,它不会被读取。
RajaRaviVarma

我刚刚测试了@RajaRaviVarma(Ubuntu 16.04),并且~/.profile绝对在非图形登录外壳中读取了该文件(我通过通过切换到另一个终端Ctrl+Alt+F2并在那里登录进行了测试)。
waldyrious

我同意@RajaRaviVarma-我正在通过SSH登录到Ubuntu 16.04 VM,并且.profile无法读取,仅.bashrc
jamesc

0

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


0

如果Bash 作为交互式登录shell执行,则Bash仅查找.bash_login或查找.profile文件。当它作为交互式非登录外壳程序执行时,它将读取.bashrc
通常是第二种情况,即当您运行gnome-terminalbash时,它作为非登录shell运行。

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

这里被部分撕掉。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.