在Windows和linux系統(tǒng)之間對同一個文件進(jìn)行交替操作時,常常會遇到一些奇怪的問題,比如無法執(zhí)行shell腳本或者找不到shell腳本等情況。本文由花神廟碼農(nóng)撰寫,將針對這一問題進(jìn)行總結(jié),供大家參考。
換行符格式差異
- 換行符(EOL)是一個特殊的字符或字符序列,用于表示一行文本的結(jié)尾和新行的開頭;
- 在不同操作系統(tǒng)中,表示換行符的實(shí)際代碼有所不同:– microsoft Windows和DOS系統(tǒng)使用CR + LF表示換行;– 類unix系統(tǒng)如Linux、OS X、FreeBSD使用LF;– 而MAC系統(tǒng)使用CR;
- CR對應(yīng)ASCII碼的0x0D( ),LF對應(yīng)ASCII碼的0x0A( )。DOS系統(tǒng)下的換行符為( ),類Unix系統(tǒng)下為( )。在類Unix系統(tǒng)中,DOS系統(tǒng)下的’ ’會被顯示為 ^M。
接下來,以名為test-dos.sh的文件為例,詳細(xì)說明不同操作系統(tǒng)下的換行符格式差異。
#!/bin/bash echo?"Hello?World?!"
格式影響
直觀影響
- Unix/Mac系統(tǒng)下的文件在Windows里打開的話,所有文字會變成一行(由于Windows下編輯器的處理,這種情況一般不會發(fā)生);
- 而Windows里的文件在Unix/Mac下打開的話,在每行的結(jié)尾可能會多出一個^M符號;
功能影響
[qxhgd@localhost?crlf]$?./test-dos.sh -bash:?./test.sh:?/bin/bash^M:?bad?interpreter:?No?such?file?or?directory
- 如果在make編譯的時候,執(zhí)行mksh(一個shell文件)可能會有類似下面的提示:
make[3]:?./mksh:?Command?not?found
格式查看
Windows下查看
- 利用編輯器,如visual studio Code、UltraEdit、Notepad2等軟件,如在狀態(tài)欄顯示為CR+LF則為Windows格式,如果顯示為LF則為Linux格式:
- 利用支持擴(kuò)展搜索的編輯器,如Notepad++,查找 :
Linux下查看
- cat命令 顯示^M:
[qxhgd@localhost?crlf]$?cat?-v?test-dos.sh #!/bin/bash^M echo?"Hello?World?!"^M
顯示Tab:
[qxhgd@localhost?crlf]$?cat?-T?test-dos.sh #!/bin/bash ^Iecho?"Hello?World?!"
- od命令 od可以單獨(dú)使用:
[qxhgd@localhost?crlf]$?od?-c?test-dos.sh 0000000???#???!???/???b???i???n???/???b???a???s???h?? ?? ???e???c???h 0000020???o???????"???H???e???l???l???o???????W???o???r???l???d???????! 0000040???" 0000041
也可以和cat配合使用:
cat?test-dos.sh|?od?-c
- hexdump命令
[qxhgd@localhost?crlf]$?hexdump?-c?test-dos.sh 0000000???#???!???/???b???i???n???/???b???a???s???h?? ?? ???e???c???h 0000010???o???????"???H???e???l???l???o???????W???o???r???l???d???????! 0000020???" 0000021
狀態(tài)欄下會顯示:
?
“test-dos.sh” [noeol][dos] 2L, 33B
命令模式下執(zhí)行set ff:
??fileformat=dos
- gedit
— 首先使用gedit打開文件:
[qxhgd@localhost?crlf]$?gedit?test-dos.sh
— 搜索 ,如果搜索到了就表示是DOS格式:
格式修改
Windows下
- 可以利用編輯器修改,如visual studio code,點(diǎn)擊狀態(tài)欄右下方的CRLF,選擇“行尾序列”可修改為LF的格式;
- 有的編輯器,如Notepad2,有Line Endings可供選擇:
- 利用支持?jǐn)U展搜索的編輯器,如Notepad++,可將 替換掉:
Linux下
利用特殊工具轉(zhuǎn)換
- vim vim命令模式下,執(zhí)行set ff=unix或set fileformat=unix即可將DOS格式轉(zhuǎn)換為unix格式;
- dos2unix 需要額外用命令安裝,一般的Linux系統(tǒng)不帶的;unix2dos與dos2unix作用正相反。
[qxhgd@localhost?crlf]$?dos2unix?test-dos.sh dos2unix:?converting?file?test-dos.sh?to?Unix?format?... [qxhgd@localhost?crlf]$?dos2unix?-n?test-dos.sh?test-unix.sh dos2unix:?converting?file?test-dos.sh?to?file?test-unix.sh?in?Unix?format?...
- tofrodos 這一組一共兩個命令,todos和fromdos,fromdos用來將dos轉(zhuǎn)換成unix格式,todos是用于將unix轉(zhuǎn)換成dos格式的,使用例子如下:
[qxhgd@localhost?crlf]$?fromdos?test-dos.sh
利用文本處理工具
- sed
— 轉(zhuǎn)換一個文件:
sed?‘s/^M//’?test-dos.sh>?test-unix.sh
— 轉(zhuǎn)換多個文件:
find?./?-type?f?print0?|?xargs?-0?sed?-i?'s/^M$//'
- vi
?
— 1、vi test-dos.sh — 2、:%s/^M//g或:%s/ //g
— 3、esc退出 :wq保存退出
其中^M 必須是同時按 Ctrl+V+M(按住Ctrl鍵,然后依次V、M鍵)或依次按Ctrl + V然后Ctrl + M,表示回車。
- tr
tr?-d?" "?test-dos.sh?????????????????? cat?test-dos.sh|tr?-d?‘/r'?>?test-unix.sh? tr?-d?' '??test-unix.sh
cat?test-dos.sh?|?perl?-pe?‘~s/ //g’?>?test-unix.sh perl?-p?-e?'s/ //g'?test-dos.sh>?test-unix.sh perl?-pi?-e?'s/ / /g'?test-dos.sh