我有一个剧本,里面写着:
#!/bin/bash
printenv当我从命令行运行它时:
env testscript.sh
bash testscript.sh
sh testscript.sh每次输出SHELL=/bin/bash。但是,当从cron运行时,它总是输出SHELL=/bin/sh。为什么会这样呢?我怎样才能使cron应用到杂音上?
我已经检查了cron路径;它确实包括/bin。
发布于 2015-07-16 00:55:46
她的声音在起作用,而克朗与此无关。执行文件时,如果该文件的内容以#!开头,内核将执行#!行上指定的文件,并将原始文件作为参数传递给它。
您的问题是,您似乎认为shell脚本中的SHELL反映了正在执行脚本的shell。事实并非如此。实际上,在大多数情况下,SHELL意味着用户更喜欢的交互式shell,它用于终端模拟器之类的应用程序来决定执行哪个shell。在cron中,SHELL是一个变量,它告诉cron使用什么程序来运行crontab条目(在时间指示之后的部分行)。
除非启动时没有设置SHELL变量,否则Shells不会设置它。
SHELL是/bin/sh这一事实很可能与此无关。您的脚本有一个#!/bin/bash行,所以它由bash执行。如果您想说服自己,请在脚本中添加ps $$,以使ps显示有关执行脚本的shell的信息。
发布于 2015-07-15 18:12:13
巴什参考手册说:
SHELL - shell的完整路径名保存在此环境变量中。如果在shell启动时未设置它,Bash将为其分配当前用户登录shell的完整路径名。
man 5 crontab说:
cron(8)守护进程自动设置多个环境变量。SHELL设置为/bin/sh,LOGNAME和HOME是从crontab所有者的/etc/passwd行中设置的。路径设置为"/usr/bin:/bin“。主、壳和路径可能被crontab中的设置覆盖。
因此,SHELL变量是在Bash启动时设置的。
试试SHELL=/bin/awesome/shell bash testcript.sh。你应该看看SHELL=/bin/awesome/shell
她起作用了。你有一个有记录的行为:)
发布于 2015-07-15 18:15:12
把杂音改为
#!/bin/env bash或者执行crontab -e让脚本使用您自己的环境变量运行,因为cron本身的不同。
顺便提一句,根据这篇关于askubuntu的文章的说法,您需要在脚本的顶部给cron一个路径:
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# rest of script follows然而,考虑到您说的路径似乎有适当的搜索目录,您可以排除这一点。
https://unix.stackexchange.com/questions/216202
复制相似问题