當一個文件在 Windows 和 Linux 上交替操作后,經常遇到一些莫名其妙的問題,如 shell 腳本無法執行,找不到 shell 腳本等問題,本文謹就這一問題做一總結,供各位參考;
格式差異
換行符是行尾 (EOL),是一個特殊的字符或字符序列,表示一行文本的結尾和新行的開頭;
表示換行符的實際代碼因操作系統而異:-- Microsoft Windows,DOS(MS-DOS,PC DOS 等)使用 CR + LF;-- Unix 和類 Unix 系統使用,包括 Linux,OS X,FreeBSD 等使用 LF;-- MAC 系統里,使用 CR;
CR 即 ASCII 碼的 0x0D( ),LF 為 ASCII 碼的 0x0A( ),DOS 下使用( ),類 Unix 系統下使用( ),DOS 系統下的' '在類 Unix 系統下會被顯示為 ^M。
后文僅以 test-dos.sh 文件為例來說明,具體內容如下:
?
#!/bin/bash echo?"Hello?World?!"
?
格式影響
直觀影響
Unix/Mac 系統下的文件在 Windows 里打開的話,所有文字會變成一行(由于 Windows 下編輯器的處理,這種情況一般不會發生);
而 Windows 里的文件在 Unix/Mac 下打開的話,在每行的結尾可能會多出一個 ^M 符號;
功能影響
在 windows 上編寫的 shell、python 等腳本在 Linux 上?法正常的執?,會有 ^M 相關提?:
?
[qxhgd@localhost?crlf]$?./test-dos.sh -bash:?./test.sh:?/bin/bash^M:?bad?interpreter:?No?such?file?or?directory
?
如果在 make 編譯的時候,執行 mksh(一個 shell 文件)可能會有類似下面的提示:
?
make[3]:?./mksh:?Command?not?found
?
格式查看
Windows 下查看
利用編輯器,如 Visual Studio Code、UltraEdit、Notepad2 等軟件,如在狀態欄顯示為 CR+LF 則為 Windows 格式,如果顯示為 LF 則為 Linux 格式:
利用支持擴展搜索的編輯器,如 Notepad++,查找 r :
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 可以單獨使用:
?
[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
?
vim
狀態欄下會顯示:
"test-dos.sh" [noeol][dos] 2L, 33B
命令模式下執行 set ff:
?
fileformat=dos
?
gedit
-- 首先使用 gedit 打開文件:
?
[qxhgd@localhost?crlf]$?gedit?test-dos.sh
?
-- 搜索 r ,如果搜索到了就表示是 DOS 格式:
格式修改
Windows 下
可以利用編輯器修改,如 Visual Studio Code,點擊狀態欄右下方的 CRLF,選擇 “行尾序列” 可修改為 LF 的格式;
有的編輯器,如 Notepad2,有 Line Endings 可供選擇:
利用支持擴展搜索的編輯器,如 Notepad++,可將 r 替換掉:
Linux 下
利用特殊工具轉換
vim vim 命令模式下,執行 set ff=unix 或 set fileformat=unix 即可將 DOS 格式轉換為 unix 格式;
dos2unix 需要額外用命令安裝,一般的 Linux 系統不帶的;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 轉換成 unix 格式,todos 是用于將 unix 轉換成 dos 格式的,使用例子如下:
?
[qxhgd@localhost?crlf]$?fromdos?test-dos.sh
?
利用文本處理工具
sed
-- 轉換一個文件:
?
sed?‘s/^M//’?test-dos.sh>?test-unix.sh
?
-- 轉換多個文件:
?
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?"?15"?test-dos.sh?????????????????? cat?test-dos.sh|tr?-d?‘/r'?>?test-unix.sh? tr?-d?' '??test-unix.sh
?
perl
?
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
?
審核編輯:湯梓紅
評論
查看更多