代码在终端上手动运行但无法运行脚本

代码在终端上手动运行但无法运行脚本

我创建了这个脚本来使用 cron 备份我的 postgresql 数据库:

备份文件

#!/bin/bash
export PGUSER="user"
export PGPASSWORD="pass"
FECHA_ACTUAL=`date +%Y-%m-%d`
HORA_ACTUAL=`date +%H:%M`
ARCH_RESP=$FECHA_ACTUAL-$HORA_ACTUAL
pg_dump -O -Fc mydb -h localhost > /home/user/backups/backup_$ARCH_RESP.sql
find /home/user/backups/ -name '*.sql' -mtime +2 -exec rm -f {} \;
unset PGUSER
unset PGPASSWORD

如果我复制此代码并将其粘贴到终端上,它可以正常工作,但如果我尝试运行该脚本,则会收到此错误:

user@dental:~/scripts$ ./backup.sh
导出:错误的解释器:没有这样的文件或目录

我的脚本有问题吗?还是说它的解释是错误的?

答案1

如果第一行仅以 CR(而不是 LF)终止,我会得到相同的错误:

$ echo -en '#!/bin/bash\rexport foo=bar\n' > test.sh
$ chmod +x test.sh
$ ./test.sh
export: bad interpreter: No such file or directory

发生的情况是内核查找名为 的解释器程序/bin/bash\rexport,但没有找到它,并抛出一个错误。 Bash 打印一条带有文件名的错误消息

bash: ./test.sh: /bin/bash\rexport: bad interpreter: No such file or directory

但由于回车将输出移回到该行的前面,因此您只能看到

export: bad interpreter: No such file or directory

所以问题似乎出在行尾上。

请注意,对于 DOS 风格的 CRLF 行结尾,结果是不同的,因为现在有一个 LF 来结束该行。

$ echo -en '#!/bin/bash\r\nexport foo=bar\n' > test.sh
$ ./test.sh    
bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory

虽然我不知道为什么 bash 这次似乎在输出中引用 CR ^M


IIRC 单独的 CR 作为行结尾是旧 Mac 系统的残余,并且dos2unix默认情况下似乎没有修复它。您需要使用mac2unixdos2unix -c mac

如果您碰巧将所有样式混合在一起并且不需要任何其他意义上的 CR,类似这样的操作也应该将所有 CR 或 CRLF 转换为 Unix 风格的 LF 行结尾。

sed 's/\r/\n/g;s/\n$//' backup.sh

相关内容