FFFTPの転送モードが自動判別に設定していたので、意図しない動作になったよ
というお話
FFFTPはWindowsではド定番かつシンプル高機能で使いやすいFTP転送ができるソフトです。
私はこれまでは、Windowsでもバーチャルマシン上のLinuxマシンからそのままFTPしたり、cygwinイントール環境が整っていたので端末からFTPしたり、そもそも開発環境がLinuxだったりしたので、FFFTPを開発で使用することは多くありませんでした。
今回は開発用PCが別途与えられたので、せっかくWindowsだったら定番のものでやってみよう
と軽い気持ちで始めたのが、半日潰す要因になってしまいました。。。
結論
転送モードが自動判定モードで、デフォルトの条件でAsciiモードリストに入っていたため、自動で終端(今回はLF ⇒ CRLF)が変換されてしまっていました。
ファイルの拡張子が「.sh」だったことに依存します。
転送モードをバイナリモードにしたらうまくいきました。
環境
・ローカル(FTP送信)
OS:Windows
エディタ:MS VS code
・ホスト(FTP受信)
Linux (今回は組み込み用)
何にはまったか
バイナリデータやWEBソースを特に意識せずに、すでにやり取りをしていて問題は起きていませんでした。
だいぶ環境が固まってきてフォルダ構成も決まり、web一式は圧縮してこのフォルダに置き起動時に解凍してあげよう、
と起動スクリプトを作成しFTPで転送したのですが何度やってもうまくいかない。
この時のスクリプト実行エラーが
./start.sh: line 45 syntax error: unexpected end of file (expecting "then")
うん、何か間違っている。
構文エラーだ。
moreしてスクリプトを確認
xxx@xxx: more ./start.sh
先頭に記述が必要な、忘れがち&タイプミス多め(私だけ?)のおまじない
#!/bin/sh
:
問題なし。
その他、念入りにタイプミスのチェック・・・
:
:
:
あっていそう
シンプルにスクリプトを修正。
ifなんて使わない!
(fiで閉じってなに。いつ見てもこれがタイプミスに見えてしまうよ
いざ実行!
// xxxはいろいろ省略
: not found: xxx
: not found: xxx
:
: No such file or directory xxx
:
mv can't rename 'xxx' : No such file or directory
cp can't stat 'xxx' : No such file or directory
いやいや、ファイルもディレクトリもあるし!
ヘンテコエラーすぎて頭の中もエラーに。
しかも厄介なことにシンプルにしすぎると、
-sh: ./start.sh: not found
ファイルは確かにあるのに、not found
カーネルを壊したかと思ってしまいます。
構文エラーやnot foundエラー
単純にそうであれば、一番何ともないエラーなんだけど
違う要因でこのようになっていた場合、何が本質かわからなくなり
一番迷子になってしまうことが多いです。
やっとここで初めて、そもそもを疑い始めました。
もしかしたらWindowsでスクリプト編集しているから、改行コードがおかしい?
うん、ここでは問題なさそう。
ホスト環境(Linux側)でviするしかない。
vi 難しいから避けたい(むしろこの気持ちが一番の悪だったのかもしれない
いた
^M "それは"見てはいけないやつ
^M
シェルスクリプトを実行するには改行コードはLFのみでなければならない
これがいるってことは、Windowsの日本語文字コードであるShift-JISかつ改行コードがCR+LFになっていることがわかりました。
シェルスクリプトをWindowsで作業することが間違いだった。
エディタの設定が違っているに違いないと推測。
エディタはおなじみVS Code
画面右下のプロパティを確認
行1、列1 スペース:4 UTF-8 LF Shell Script
うーん、あっていそう。
.shをシェルスクリプトとも認識しているし。素晴らしい。
MSさんも心が広くなった。(拡張機能なのかな?
なんだか改行コードあっていそう。
でも保存するとおかしくなるのか?
会社が秀丸さんにお布施をしているので、秀丸さんで保存したファイルを開く。
[ファイル]メニュー ⇒ [エンコードの種類]
・Unicode(UTF-8)
・改行=LF
ここでも問題なさそうだ。
ますます分からない。
最終手段、バーチャルマシンでLinux起動。
ここまで来たら純なemacsしかない。
共有フォルダへ起動スクリプトをコピー。
emacsで開く。
やっぱりあっている。
もしかしてだけど
もしかしてだけど
FTPするときにファイルが勝手にかわっているんじゃないのぉ
問題はスクリプトファイルをFTPしたら発生しました。
そうでした。
見事にはまりました。
FFFTP
確かにプラットフォームが変わるときに、ASCIIモードに設定しておけば自動で変わると楽かもしれない。
でもやっぱり自分で意図せずファイルの中身が変わるのは気持ちが悪い。。。
今後は必ずバイナリモードにして、改行コードもファイル単位できちんと管理しようと心に決めました。