在打开shell时首次执行一个bash脚本

3
有没有一种方法可以每天自动执行一个bash脚本,也就是说,我希望每天打开shell终端时都会执行这个脚本?
谢谢!
3个回答

5

如果您希望脚本仅在打开shell终端时运行,请将其添加到您的~/.bashrc/etc/bash.bashrc/etc/bashrc文件中。这将在启动交互式非登录shell时随时执行。

如果您希望每天执行它,请在/etc/crontabcrontab -e中创建一个cron。


2
请注意,在~/etc中添加的区别。前者仅适用于~所指的用户,而/etc将适用于所有用户。 - fedorqui

5

Bash有两个文件,从用户的角度来看,在启动时执行"设置":

  • .bash_profile - 每次打开一个交互式登录shell时都会执行此文件。在某些发行版或配置中,该文件也可能被命名为.profile.profile通常用于非Bash特定的配置项。还要注意,如果您有很少使用的.bash_login.bash_profile将阻止该文件的使用,尽管它在其他方面是等效的。.bash_profile是标准的。
  • .bashrc - 此文件对所有其他bash实例执行。请注意,人们通常从.bash_profile调用.bashrc以创建一致性。

当您登录时,将生成一个登录shell;通过ssh、telnet、控制台等方式。您还可以强制启动一个登录shell(强制处理.bash_profile),方法是在su下启动shell:

su - username

这里的破折号表示应将其处理为登录 shell。

然而,除非您每天登录一次且仅登录一次,否则这两个选项都不是您问题的正确答案。

在您的情况下,更好的方法是使用 cron。 Crontab 允许您安排任务以任何所需的间隔运行。 对于每日执行,您可能希望配置类似以下的行:

0 5 * * *              /home/user/script

这会导致用户的脚本每天早上5点执行。列如下:

0 5 * * *
^ ^ ^ ^ ^------ Day of week
^ ^ ^ ^-------- Month of year
^ ^ ^---------- Day of month
^ ^------------ Hour of day
^-------------- Minute of hour

每个字段还可以表示逗号分隔的列表甚至是算术表达式。例如,以下内容将在凌晨5点期间执行四次脚本:

*/4 5 * * *

需要注意的是,根据您所使用的发行版 Bash 的实现方式,bash_profile 文件可能被称为 "profile"。 - Justin E
您也可以通过键入. ~/.bash_profilesource ~/.bash_profile来“加载”您的bashrc文件以“激活”该文件。 - Justin E

1
虽然提供的答案很有用,但实际上并没有解决最初的需求。
请求是每天在第一次登录时运行脚本,当天其余时间不再运行,但在第二天的第一次登录时再次运行,以此类推...
为了实现这一点,您可以将要执行的脚本放置在~/bin或任何您想要的位置。
在script.sh的底部添加以下三行,这将在随后的登录中移除脚本的执行。
cat ~/.bash_profile | grep -v script.sh > bash_profile.tmp
rm -f ~/.bash_profile
mv bash_profile.tmp ~/.bash_profile

这三行代码的作用如下:
  1. 读取你的 .bash_profile 文件,并将除包含 script.sh 的那一行之外的所有内容写入一个临时文件
  2. 删除包含执行脚本的 bash 配置文件
  3. 将不包含 script.sh 行的临时文件重命名为你新的 .bash_profile,以在后续登录时使用。
然后,使用 'crontab -e' 命令添加一行到 crontab 中,在每天早上你认为是当天最后一次登录后但第一次登录前的时间,将该行重新添加到你的 .bash_profile 文件中。
这个例子设置为 0 分钟 + 4 小时,即凌晨 4 点。
0 4 * * * echo "~/bin/script.sh" >> ~/.bash_profile

然而,这存在一个问题。例如,如果用户仅在周一至周五登录系统,而不是周六或周日,则crontab仍会在周六和周日早上将该行添加到配置文件中,这意味着到周一早上将会有三个相同的行。这将导致脚本运行三次。为了缓解这个问题,在它周围包装了一个IF语句来检查是否已经存在该命令,然后再添加它。
0 4 * * * if [ "$(grep -c '~/bin/script.sh' ~/.bash_profile)" -eq 0 ]; then echo "~/bin/script.sh" >> ~/.bash_profile ; fi

最终结果如下:
  • 您的脚本将在每天第一次登录时执行
  • 最后,您的脚本将删除触发器以便不再在登录时执行
  • 您的脚本将不会在随后的登录中执行
  • 每天早上,crontab 将把触发器添加回您的 .bash_profile 中,以便在下次登录时(即当天的第一次登录)执行。
  • 但是,只有在触发器不存在时,crontab 才会添加触发器。

注意:这可能不是最有效或最优雅的解决方案,但它确实可行,并且非常容易理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接