Shebang 不会在 cron 中设置 SHELL

Ben*_*ird 8 shell bash cron shebang

我有一个包含以下内容的脚本:

#!/bin/bash
printenv
Run Code Online (Sandbox Code Playgroud)

当我从命令行运行它时:

env testscript.sh
bash testscript.sh
sh testscript.sh
Run Code Online (Sandbox Code Playgroud)

每次,它输出SHELL=/bin/bash. 但是,当它从 cron 运行时,它总是输出SHELL=/bin/sh. 为什么是这样?我怎样才能让cron应用shebang?

我已经检查了 cron PATH;它确实包括/bin。

Gil*_*il' 8

shebang 正在工作,而 cron 与此无关。执行文件时,如果该文件的内容以 开头#!,则内核执行该#!行指定的文件并将原始文件作为参数传递给它。

您的问题是您似乎相信SHELL在 shell 脚本中反映了正在执行脚本的 shell。不是这种情况。事实上,在大多数情况下,SHELL是指用户首选的交互式shell,它是指终端模拟器等应用程序来决定执行哪个 shell。在 cron 中,SHELL是一个变量,它告诉 cron 使用什么程序来运行 crontab 条目(时间指示之后的行部分)。

Shell 不会设置SHELL变量,除非它在启动时没有设置。

这事实上SHELL/bin/sh很可能是无关紧要的。您的脚本有#!/bin/bash一行,因此它由 bash 执行。如果要说服自己,请ps $$在脚本中添加以ps显示有关执行脚本的shell 的信息。