在脚本 shebang 中使用“-l”有什么优点和缺点

在脚本 shebang 中使用“-l”有什么优点和缺点

我最近想出了一个简单的解决方案crontab 日志记录问题我想知道使用此特定修复程序(使用“登录 shell 标志”运行脚本)的优点和缺点是什么,如下所示:

#!/bin/bash -l 

答案1

[以下假设您未指定的“日志记录问题”与缺少环境设置有关,通常从您的个人资料继承。]

该选项告诉 bash从您的主目录-l读取所有各种“配置文件”脚本。 /etcBash 通常只对交互式会话执行此操作(其中 bash 在没有任何命令行参数的情况下运行)。

普通脚本没有必要读取配置文件;他们应该在给定的环境中运行。也就是说,您可能希望对个人脚本执行此操作,如果它们与您的环境紧密绑定并且您计划在正常会话之外运行它们。

crontab 是在会话之外运行脚本的一个示例,所以是的,去做吧!

如果脚本仅供 crontab 使用,则将其添加-l到 shebang 中即可。如果您可能以其他方式使用该脚本,则请考虑修复 crontab 本身的环境问题:

0 * * * * bash -l hourly.sh

答案2

老实说,我没有看到在登录 shell 中运行非交互式脚本有任何好处。

登录 shell 将解析相关的登录 shell 初始化文件(bash使用~/.bash_profile)来设置 shell 会话的环境等。

相信用户可能会在此文件中执行各种有趣的操作,例如启动tmux(如这个问题)或者甚至exec完全在另一个 shell 上运行(如这个问题,和这个)。

相反,脚本需要运行的环境应该在$BASH_ENV.该文件将由任何非交互式bashshell 获取。

从 cron 作业运行的脚本不会在交互式 shell 或登录 shell 中运行,然后需要将其启动为

@daily    BASH_ENV="$HOME/script.env" "$HOME/script.sh"

(对于在午夜触发的日常作业)这里$HOME/script.env可能是$HOME/.bashrc环境设置的地方。

相关内容