Linux Bash脚本在从crontab执行时工作,但不在中

Linux Bash脚本在从crontab执行时工作,但不在中,linux,bash,shell,cron,crontab,Linux,Bash,Shell,Cron,Crontab,我是linux新手,下面的脚本只是我问题的一个例子: 我有一个脚本,当我执行它时,它会按预期工作,但是当我设置它通过crontab运行时,它不会按预期工作,因为它不会将文件内容读入变量 我有一个文件“test.txt”,里面有“abc”。我的脚本将文本放入变量“var”中,然后将其回显到日志文件中: var=$(</home/pi/MyScripts/test.txt) echo "$var" >/home/pi/MyScripts/log.log cron作业正在运行,它向我发送

我是linux新手,下面的脚本只是我问题的一个例子:

我有一个脚本,当我执行它时,它会按预期工作,但是当我设置它通过crontab运行时,它不会按预期工作,因为它不会将文件内容读入变量

我有一个文件“test.txt”,里面有“abc”。我的脚本将文本放入变量“var”中,然后将其回显到日志文件中:

var=$(</home/pi/MyScripts/test.txt)
echo "$var" >/home/pi/MyScripts/log.log
cron作业正在运行,它向我发送了以下错误消息:

/bin/sh: 1: /home/pi/MyScripts/test.sh: Permission denied.
但我已经给了它777个权限:

-rwxrwxrwx 1 pi pi   25 Jun 10 15:31 test.txt
-rwxrwxrwx 1 pi pi   77 Jun 10 15:34 test.sh

有什么想法吗?

使用不同的shell运行脚本时会发生这种情况。它特别适用于
/bin/sh
破折号的系统:

$ cat myscript 
echo "$(< file)"

$ bash myscript
hello world

$ sh myscript

$ 
$cat myscript
echo“$(

要修复它,请添加
#/bin/bash
作为脚本中的第一行

您有两个选择。在文件的第一行中,告诉您要解释脚本的程序

#!/bin/bash
...more code...
* * * * * bash /home/pi/MyScripts/test.sh
或者在crontab中,告诉您要解释脚本的程序

#!/bin/bash
...more code...
* * * * * bash /home/pi/MyScripts/test.sh

在这个选项中,您不需要使脚本可执行

其他人已经提供了答案,但我将从您的错误消息中给您一个大线索;重点地雷:

/bin/sh:1:/home/pi/MyScripts/test.sh:权限被拒绝

注意cron作业如何尝试使用
/bin/sh
运行脚本。通过始终在脚本顶部指示要使用的shell(如下所示),可以解决这个问题

#!/bin/bash
var=$(</home/pi/MyScripts/test.txt)
echo "$var" >/home/pi/MyScripts/log.log
#/bin/bash
var=$(/home/pi/MyScripts/log.log)
如果脚本使用的是
bash
,则必须以某种方式显式设置
/bin/bash

另外,关于权限,您可以这样说:

但我已经给了它777个权限:

-rwxrwxrwx 1 pi pi   25 Jun 10 15:31 test.txt
-rwxrwxrwx 1 pi pi   77 Jun 10 15:34 test.sh
首先,
777
权限是一个巨大的安全风险。如果您这样做,则意味着系统上的任何人或任何东西都可以读取、写入和执行文件。不要这样做。对于cron作业,对文件需要
7
权限的唯一实体是运行该文件的crontab的所有者


这意味着,如果这是您的crontab,只需将权限更改为
755
,允许其他人读取和执行,但不允许写入。或者最好将其更改为
700
,这样只有您作为文件所有者才能对文件执行任何操作。但是,如果您希望保持系统安全、稳定和正常,请避免使用
777
权限

确保将shebang放在最上面。如
#!/bin/bash
。您希望它多长时间执行一次?每分钟一次?如果它无法打开文件,您将收到一条错误消息,并通过电子邮件发送给您。无论您可能遇到什么其他问题,0777总是错误的,并且存在安全风险。正确的权限是例如0755。@JakeGould您需要al上的+xl引导执行脚本的目录,即使脚本本身是777并且您使用绝对路径。此外,错误发生在执行
/home/pi/MyScripts/test.sh
。不执行此文件的第1行。
***sh/home/pi/MyScripts/test.sh
将导致相同的错误,因为这是
bash
脚本和t该错误清楚地表明标准外壳(
/bin/sh
)我试图运行它。@JakeGould,这两个命令中有一个正确吗?可以通过在顶部写#!/bin/sh来修复吗?第一个是正确的。第二个不是。用户使用的是
bash
,它不是
sh
。@JakeGould,我做了更改。0755是为组和其他组读取和执行的,不是读和写的(这是你无论如何都要阻止的写入)。@tripleee你是对的。今天有点混乱。
755
很好,因为它允许组成员和其他人执行和读取文件。但他们不能写入。这是一种允许访问的有用方法,但不会有意外地在可执行文件中过度写入内容的风险。