我创建了这个脚本来使用 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
默认情况下似乎没有修复它。您需要使用mac2unix
或dos2unix -c mac
。
如果您碰巧将所有样式混合在一起并且不需要任何其他意义上的 CR,类似这样的操作也应该将所有 CR 或 CRLF 转换为 Unix 风格的 LF 行结尾。
sed 's/\r/\n/g;s/\n$//' backup.sh