web-dev-qa-db-ja.com

シェルスクリプトはshコマンドでのみ実行できます

リモートサーバーへのバックアップに使用する小さなshスクリプトがあります。それは何年もUbuntu 16.04で動作しましたが、現在18.04では失敗します。最初はアナクロンの問題だと思っていましたが、今はスクリプト自体やダッシュの問題だと思います。これが起こっていることです:

stefan@stefan-Aspire-F5-573T:/etc/cron.daily$ Sudo chmod +x rsync-doc-script 
[Sudo] Mot de passe de stefan : 
stefan@stefan-Aspire-F5-573T:/etc/cron.daily$ ./rsync-doc-script 
/bin/sh: 0: Can't open *
stefan@stefan-Aspire-F5-573T:/etc/cron.daily$ sh rsync-doc-script
opening connection using: ssh -i /home/stefan/.ssh/id_rsa -l totem MouseHouse rsync --server -vvlogDtprze.iLsfxC . /totembackup/totemdoc  (11 args)
ssh: connect to Host mousehouse port 22: Connection refused
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(235) [sender=3.1.2]
stefan@stefan-Aspire-F5-573T:/etc/cron.daily$ 

エラーcan't open *により、run-partsによるスクリプトの実行が正しく実行されません。このエラーが発生するのはなぜですか?

最後の行でスクリプトが実行されたときに接続を確立できなかったことは関係ありません。サーバーは現在オフになっています。

スクリプトは次のとおりです。

#!/bin/sh                                                                                     *
rsync -azvv -e "ssh -i /home/stefan/.ssh/id_rsa" /home/stefan/Documents/ totem@MouseHouse:/totembackup/totemdoc

5
Stefan Dawydiak

はっきりとはわかりませんが、最初の行にタイプミスがあり、右側に「*」が残っているようです。

#!/bin/sh                                                                                     *

^^^右にスクロールして確認してください。

$ cat script.bash
#!/bin/sh                    *
echo hi

直接実行:

$ ./script.bash
/bin/sh: *: No such file or directory

sh経由で実行:

$ sh script.bash
hi

一般的なアドバイス

通常、シバンで期待しているシェルをそのまま使用することをお勧めします。 dashや他のシェルが使用されていると思われる問題が発生していると思われる場合は、#!/bin/shをShebang #!/bin/bashに変更することで、常に明示的にShebangにすることができます。

上記は、以下のコメントに基づいています。

しかし今は、スクリプト自体またはダッシュの問題だと思います。

9
slm