コードは端末で手動で実行されますが、スクリプトを実行することはできません。

コードは端末で手動で実行されますが、スクリプトを実行することはできません。

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

おすすめ記事