![在脚本 shebang 中使用“-l”有什么优点和缺点](https://linux22.com/image/127155/%E5%9C%A8%E8%84%9A%E6%9C%AC%20shebang%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E2%80%9C-l%E2%80%9D%E6%9C%89%E4%BB%80%E4%B9%88%E4%BC%98%E7%82%B9%E5%92%8C%E7%BC%BA%E7%82%B9.png)
我最近想出了一个简单的解决方案crontab 日志记录问题我想知道使用此特定修复程序(使用“登录 shell 标志”运行脚本)的优点和缺点是什么,如下所示:
#!/bin/bash -l
答案1
[以下假设您未指定的“日志记录问题”与缺少环境设置有关,通常从您的个人资料继承。]
该选项告诉 bash从您的主目录-l
读取所有各种“配置文件”脚本。 /etc
Bash 通常只对交互式会话执行此操作(其中 bash 在没有任何命令行参数的情况下运行)。
普通脚本没有必要读取配置文件;他们应该在给定的环境中运行。也就是说,您可能希望对个人脚本执行此操作,如果它们与您的环境紧密绑定并且您计划在正常会话之外运行它们。
crontab 是在会话之外运行脚本的一个示例,所以是的,去做吧!
如果脚本仅供 crontab 使用,则将其添加-l
到 shebang 中即可。如果您可能以其他方式使用该脚本,则请考虑修复 crontab 本身的环境问题:
0 * * * * bash -l hourly.sh
答案2
老实说,我没有看到在登录 shell 中运行非交互式脚本有任何好处。
登录 shell 将解析相关的登录 shell 初始化文件(bash
使用~/.bash_profile
)来设置 shell 会话的环境等。
相信用户可能会在此文件中执行各种有趣的操作,例如启动tmux
(如这个问题)或者甚至exec
完全在另一个 shell 上运行(如这个问题,和这个)。
相反,脚本需要运行的环境应该在$BASH_ENV
.该文件将由任何非交互式bash
shell 获取。
从 cron 作业运行的脚本不会在交互式 shell 或登录 shell 中运行,然后需要将其启动为
@daily BASH_ENV="$HOME/script.env" "$HOME/script.sh"
(对于在午夜触发的日常作业)这里$HOME/script.env
可能是$HOME/.bashrc
环境设置的地方。