繁体   English   中英

第一次打开 shell 执行一个 bash 脚本

[英]Execute a bash script the first time shell opens

有没有办法每天自动执行 bash 脚本,也就是说我希望每天第一次打开 shell 终端时执行 bash 脚本?

谢谢!

如果你想脚本的时候,你只打开外壳终端运行,它添加到您~/.bashrc/etc/bash.bashrc/etc/bashrc文件。 这将在任何时候启动交互式非登录shell时执行。

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

从用户的角度来看,Bash有两个文件在启动时执行“setup”:

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

登录时会生成登录shell; 通过ssh,telnet,在控制台等处。你也可以通过在su下启动shell来强制启动登录shell(强制.bash_profile),如下所示:

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 * * *

虽然提供了信息,但所提供的答案实际上并不能解决原始需求。

请求是让脚本每天运行一次,在第一次登录时,而不是当天的 rest,而是在第二天第一次登录时再次运行,然后是下一天,等等......

为此,您可以将要执行的脚本放在 ~/bin 或您想要的任何位置。

在 script.sh 的底部添加这三行,这将在后续登录时删除脚本的执行。

cat ~/.bash_profile | grep -v script.sh > bash_profile.tmp
rm -f ~/.bash_profile
mv bash_profile.tmp ~/.bash_profile

这三行的作用:

  1. 读取 your.bash_profile 并将除包含 script.sh 的行之外的所有内容写入 tmp 文件
  2. 删除包含脚本执行的现有 bash 配置文件
  3. 将不带 script.sh 行的 tmp 文件重命名为后续登录时的 new.bash_profile。

然后,使用“crontab -e”在 crontab 中添加一行,这将在您认为是在您当天最后一次登录之后但在您第一次登录天。

此示例设置为零分钟 + 四个小时,即凌晨 4:00。

0 4 * * * echo "~/bin/script.sh" >> ~/.bash_profile

然而,这存在一个问题。

例如,如果用户只登录到系统 MF 而不是周六或周日。 crontab 仍会将行添加到配置文件周六和周日早上,这意味着周一早上将有三行相同的行。 这将导致脚本运行三次。

为了缓解这种情况,在它周围环绕了一个 IF 语句,以在添加命令之前检查该命令是否已存在于文件中。

0 4 * * * if [ "$(grep -c '~/bin/script.sh' ~/.bash_profile)" -eq 0 ]; then echo "~/bin/script.sh" >> ~/.bash_profile ; fi

最终结果是:

  • 您的脚本将在当天首次登录时执行
  • 最后,您的脚本将删除触发器以在登录时执行
  • 您的脚本不会在后续登录时执行
  • 每天早上,crontab 都会将触发器添加回 your.bash_profile,以便在下次登录时执行它,这将是当天的第一次登录。
  • 但是 crontab 只会在触发器尚不存在时添加它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM