web-dev-qa-db-ja.com

^ Mで壊れたシェルスクリプトまたはファイルの行末を自動的に修正する方法

問題

私たちは定期的にファイルの行末を壊し、気付かないうちに動作を停止します。

Bashは、ここで説明されているように、「無効なオプション」または「:コマンドが見つかりません」について文句を言います: http://thinkinginsoftware.blogspot.ca/2012/11/linux-server-cries-for-linux-desktop.html

これにより他のテキストファイルも破損する可能性があるのではないかと心配しています(conf、crons ...)

どのようにそれを壊すか(私は思う)

私たちは、Windows、Mac、またはLinuxを使用して1つのサーバー上のLinuxファイルを編集する人々のグループです。これらのファイルを手動で編集します(ssh + vi/nanoまたはlocaly + ftp)。 コピーして貼り付けることがありますが、これが問題の原因だと思います。 はい、あまり良くない理由で変更をテストしない場合があります。同じスクリプトがレプリケートサーバーで機能し、変更が一部の行をインデントするだけです。これは必要であることに同意します対処する

Chef/Puppetのようなソリューションの使用は計画されていません。

更新

TLDRのコピー&ペーストは問題ではなく、FTPは問題です。

Windows + Notepad ++ + PuTTY + nanoおよびviでWindowsの行末CRLFをコピーして貼り付けるテストを行いました。 CR(^ M)文字がフィルタリングされているように見えますが、ファイルに貼り付けられるのはLFのみです。コピー/貼り付け理論について疑問を持たせてくれたewwhiteに感謝します!

FileZillaのオプション「送信モード」を使用してFTP経由でCRLF終了ファイルを自動に転送しました。 CRLFは保持されます。 FileZillaがそれらをLFに変換できるかどうか疑問に思います。

緩和

Linux以外のOSを禁止したり、コピー&ペーストを禁止したりすることはできません。

私はそれらの解決策を考えました:

  1. すべてのスクリプトでdos2unixまたはsedを実行するcron.minutelyを作成します。短所:「変更可能なテキストファイル」のリストを維持する必要があります。これは、/で実行したくないためです。
  2. ファイル変更後の追加コマンドをサポートするテキストエディタを使用してください。短所:Linux以外の行末を合法的に使用しているファイルを壊す可能性があり、スクリプトをftpで実行すると機能しません。
  3. http://inotify.aiken.cz/?section=incron&page=about&lang=en のようなトリガーシステムを使用します。短所:?

#2と#3の長所:これらを使用して、それを必要とするプログラムの最後の空白行を追加することもできます。

Bashの使用、バージョン4.2.37(1)-リリース

^ M(CRLF)に関する関連質問

編集:反対票が1つありましたが、その理由を説明していただけますか?

2
pyb

一部のレガシーシステムでは、これに対処する必要があります。組織のソース管理( Borland Starteam )に保持されているファイルが間違ったラインフィード構成に設定されている場合がありました。

ただし、多くのクロスプラットフォーム環境で作業している場合、コピー/貼り付けだけでこの問題が発生することはありません。以下からのアウトプットに基づいて傾向を特定し、最悪の犯罪者に適切に対処するようにしてください。

DOS改行を使用してファイルを定期的に検索します。

find /var/www -not -type d -exec file "{}" ";" | grep CRLF

例:

# find /ppro/bin -not -type d -exec file "{}" ";" | grep CRLF
/ppro/bin/compile/save/srcfix.c: ASCII C program text, with CRLF line terminators
/ppro/bin/compile/bldtag.c: ASCII Pascal program text, with CRLF line terminators
/ppro/bin/compile/bldtag.c.sav: ASCII Pascal program text, with CRLF line terminators
/ppro/bin/compile/dbcsum2.c: ASCII Pascal program text, with CRLF line terminators
/ppro/bin/hphw/print_sv.c: ASCII text, with CRLF line terminators
/ppro/bin/linuxhw/dhcpd.conf: ASCII text, with CRLF line terminators
/ppro/bin/linuxhw/dhcpd.conf.mult_subnet: ASCII text, with CRLF line terminators

次に[〜#〜]バーン[〜#〜]それら!!

覚えておいてくださいdos2unix一部のシステムでは、権限が変更されます。

4
ewwhite