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
最初の行が LF ではなく CR で終わっても同じエラーが発生します。
$ 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