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。
shebang 正在工作,而 cron 与此无关。执行文件时,如果该文件的内容以 开头#!
,则内核执行该#!
行指定的文件并将原始文件作为参数传递给它。
您的问题是您似乎相信SHELL
在 shell 脚本中反映了正在执行脚本的 shell。不是这种情况。事实上,在大多数情况下,SHELL
是指用户首选的交互式shell,它是指终端模拟器等应用程序来决定执行哪个 shell。在 cron 中,SHELL
是一个变量,它告诉 cron 使用什么程序来运行 crontab 条目(时间指示之后的行部分)。
Shell 不会设置SHELL
变量,除非它在启动时没有设置。
这事实上SHELL
是/bin/sh
很可能是无关紧要的。您的脚本有#!/bin/bash
一行,因此它由 bash 执行。如果要说服自己,请ps $$
在脚本中添加以ps
显示有关执行脚本的shell 的信息。