【Linux】シェルスクリプトのSMTPコマンドで終了文字列が見つからずにエラー | 人生のエラー集

人生のエラー集

バグ出し率トップを誇るへっぽこプログラマーが発生させたエラーをメモのために残します。
同じエラーで悩む人の解決策になりますように…

趣味のことも書いたりしますが。

これは去年の春くらいに少しハマってしまったエラーのお話です。
シェルスクリプトを作って実行のテストをしていると、よくわからないエラーが標準出力に出てくる…
どうやらSMTPコマンドでエラーみたいだが、何度見なおしても変なことは書いていない。
なのになぜ!?原因は!?

解明するのに2時間くらいかかりました。
エラーでググっても英語の検索結果が出るばかりで解決方法が出てこなかったので、 同じエラーで悩む人のためにも記録を残そうと思います。

エラーはこんな感じで出ていました。
test.sh: line 222: warning: here-document at line 151 delimited by end-of-file (wanted `EOF')
test.sh: line 223: シンタックス エラー: 期待してないファイルの終了

シェルの内容はこんな感じです。
----------------------------------------------------------------------------------------------
#起動引数
ACTION=$0
if [ $ACTION != "" ]; then
     SFTP TEST@178.54.31.5 << EOF
     cd /var/tmp/test/
     get sample.txt
     bye
     EOF
fi
----------------------------------------------------------------------------------------------

原因の内容ですが、エラー出力に書いてある通りEOFが見つからないエラーです。
ちゃんと書いてあるんですけどね。。。
EOFの意味は、 << EOFからEOFまでに囲んだ部分がSFTP中に実行するコマンドだよ! って意味です。
cdからbyeまでがSFTP先で実行されるようにしました。

解決策ですが、『先頭のスペース、タブを消す』です。

----------------------------------------------------------------------------------------------
#起動引数 ACTION=$0
if [ $ACTION != "" ]; then
SFTP TEST@178.54.31.5 << EOF
cd /var/tmp/test/
get sample.txt bye
EOF
fi
----------------------------------------------------------------------------------------------

↑のような感じですね。
インデントされてないのが気持ち悪いですが。
内部的な仕組みはわかりませんが、終了のEOFは行の先頭に来ていないと 見つけてくれないみたいですね。
なぜなのかはわからないです。 それとも、当然そういうものなのでしょうか。
とにかく、シェルスクリプトでSFTPコマンドを実行する際は先頭のスペースやタブを消しましょう。
そうすれば無駄な時間を過ごさないで済みます。

原因がわからず10回以上シェルを見直した過去の自分に、さようなら