Linux

自動修復 shell 腳本或文件中以 ^M 中斷的行尾的方法

  • June 12, 2014

問題

我們經常破壞我們的文件行結尾,並且事情在我們沒有註意到的情況下停止工作。

Bash 抱怨“無效選項”或“:找不到命令”,如下所述:http: //thinkinginsoftware.blogspot.ca/2012/11/linux-server-cries-for-linux-desktop.html

我擔心這也會破壞其他文本文件(conf,crons …)

我們如何打破它(我想)

我們是一群使用 Windows、Mac 或 Linux 在一台伺服器上編輯 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 作業系統,也不能禁止複制粘貼。

我想到了這些解決方案:

  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)-release

^M (CRLF) 上的相關問題

**編輯:**我得到了一張反對票,你能解釋一下為什麼嗎?

有時我必須使用一些遺留系統來處理這個問題。有時,組織原始碼控制 ( 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在某些系統上會修改權限…

引用自:https://serverfault.com/questions/604709