首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >她没有在cron中设置外壳。

她没有在cron中设置外壳。
EN

Unix & Linux用户
提问于 2015-07-15 14:49:46
回答 3查看 5.5K关注 0票数 9

我有一个剧本,里面写着:

代码语言:javascript
复制
#!/bin/bash
printenv

当我从命令行运行它时:

代码语言:javascript
复制
env testscript.sh
bash testscript.sh
sh testscript.sh

每次输出SHELL=/bin/bash。但是,当从cron运行时,它总是输出SHELL=/bin/sh。为什么会这样呢?我怎样才能使cron应用到杂音上?

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

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 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的信息。

票数 9
EN

Unix & Linux用户

发布于 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

她起作用了。你有一个有记录的行为:)

票数 2
EN

Unix & Linux用户

发布于 2015-07-15 18:15:12

把杂音改为

代码语言:javascript
复制
#!/bin/env bash

或者执行crontab -e让脚本使用您自己的环境变量运行,因为cron本身的不同。

顺便提一句,根据这篇关于askubuntu的文章的说法,您需要在脚本的顶部给cron一个路径:

代码语言:javascript
复制
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# rest of script follows

然而,考虑到您说的路径似乎有适当的搜索目录,您可以排除这一点。

票数 -1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/216202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档