本人Linux菜鳥一枚,初學Linux時遇到shell文件的格式編碼問題:
!/bin/bash: No such file or directory
我按照這篇博客的方案來進行解決該問題,但是,行不通。。可能我的shell文件的問題和一般的格式問題不同,下面第一部分轉載一般的解決該問題的方法,第二部分為我自己解決該問題的方法。
第一部分轉載自:http://blog.csdn.net/zhangguangyi888/article/details/8159601
關於回車與換行
很久以前,老式的電傳打字機使用兩個字符來另起新行。一個字符把滑動架移回首位 (稱為回車,ASCII碼為0D),另一個字符把紙上移一行 (稱為換行,ASCII碼為0A)。當計算機問世以后,存儲器曾經非常昂貴。有些人就認定沒必要用兩個字符來表示行尾。UNIX 開發者決定他們可以用一個字符來表示行尾,Linux沿襲Unix,也是。Apple 開發者規定了用.開發 MS-DOS以及Windows 的那些家伙則決定沿用老式的.
三種行尾格式如下:
unix : n
dos : rn
mac : r
這意味着,如果你試圖把一個文件從一種系統移到另一種系統,那么你就有換行符方面的麻煩。
因為MS-DOS及Windows是回車+換行來表示換行,因此在Linux下用Vim查看在Windows下寫的代碼,行尾后“^M”符號。 www.2cto.com
在Vim中解決這個問題,很簡單,在Vim中利用替換功能就可以將“^M”都刪掉,鍵入如下替換命令行:
:%s/^M//g
注意:
上述命令行中的“^M”符,不是“^”再加上“M”,而是由“Ctrl+v”、“Ctrl+M”鍵生成的,或者Ctrl+v,再按回車。
或者使用這個命令:
:% s/r//g
(1)問題提出
我們可能會遇到過這樣一些困惑:
A, 如何查看一個文件或數據流的二進制格式(以十六進制格式顯示)?
B,為什么在 windows下編輯的 shell 腳本在 Unix下不能執行?為什么在 windows下編輯的 C 源文件在有些 gcc 編譯器下不能編譯?
C,為什么我在 vi 等編輯器下打開一個文本文件會包含 ^M,如何把它去掉?為什么我在 windows 上用記事本打開 unix上的文件,文件都不換行?
(2)分析與方案
A,如何查看一個文件的二進制格式(以十六進制格式顯示)?
方法一:在 UtraEdit 使用 Ctrl + H 切換到十六進制編輯模式。* 注意 * :此方法一有缺陷,它會將行末的單個”換行符”顯示成 “回車” + “換行” 兩個字符。
方法二:使用文件或流的二進制查看工具 fbin。
B,為什么在 windows下編輯的 shell 腳本在 Unix下不能執行?為什么在 windows下編輯的 C 源文件在有些 gcc 編譯器下不能編譯?
原因分析:unix 的 shell 腳本不能識別 “回車符” (即:CR,’r’),Windows 文件格式換行時,總是以 “回車” + “換行” ,導致 unix 下的 shell 無法正常解釋。解決方法:就是把 windows 格式的中的 “回車” 符刪除。
方法一:使用 vi 打開源文件,把 ‘rn’ 替換成 ‘n’ ;* 缺點 * :不適合大量文件的批量作業。
方法二:使用 UtraEdit 把 Windows 格式的文件轉換成 Unix 格式。文件–>轉換–>Unix轉DOS;* 缺點 * :不適合大量文件的批量作業。
方法三:Unix 下的 dos2unix 命令,如 $ dos2unix -k xx.c;* 缺點 * :此方法有一致命缺陷,它會改變原來的文件屬性,如一個可執行 shell 腳本的可執行屬性及其它屬性,轉換后都將會丟掉;* 優點 * :適合大量普通文件本文件的批量作業。
方法四: win2unix (windows,unix 均可使用),功能類似 dos2unix,如 win2unx xx.c;* 優點* :克服了 dos2unix 的所有缺點,它能保留源文件的任何屬性。還適合大量文件的批量作業。
C,為什么我在vi 等編器下打開一個文本文件會包含^M,如何把它去掉? 為什么我在windows上用記事本打開unix上的文件,文件都不換行?
原因分析:要解決這個問題,必先弄清 unix 與 windows 文本文件的差異。如下:
1) 磁盤中 Windows 文本文件總是以 “回車” + “換行”的形式進行換行的。
2) 磁盤中 Unix 格式的文本文件,總是以”換行符”(即:LF,’n’) 換行,而非 “回車換行符”。(Unix 規定:unix 文本文件保存到磁盤時,總是自動把 “回車換行符” 轉換成 “回車符” 保存,輸出到終端時由終端自動將將 “回車符” 轉換成 “回車換行符” 輸出)
* 結論 1 *:這樣在 windows 的記事本中打開 Unix 格式的文件時,因為文件中沒有 ‘r’,所以無法正常顯示換行,結果就會把所有的內容顯示在同一行中。
* 結論 2 *:UtraEdit 等工具會自動檢測文件中是否包含’r’,當檢查行末缺少’r’時,一般它會提示要求進行Unix 到Windows 格式的轉換(相信都遇到這個提示信息)。
* 結論 3 *:UtraEdit 和 vi 等工具,在保存文件時會自動依照文件原來的格式進行保存。即:如打開的如是 windows 格式它會把文件依然按 windows 格式保存(不進行自動轉換);如打開的如是unix 格式它會把文件依然按 unix 格式保存(不進行自動轉換)。
Linux編輯器vim中刪除行尾的^M有時候,在Linux中使用打開曾在Windows中編輯過的文件時,會在行尾看到^M字符。看起來總是感覺很別扭。刪除方法如下:在Vim的命令模式中輸入:%s/^M//g后,回車即會自動刪除該文件中的所有M字符。注意:M要用Ctrl+v,Ctrl+m來輸入,M后面的代表匹配行尾的內容,最后的g則表示每行中匹配到的內容都要置換。
可以用以下方法快速的解決:
方法1:
在命令模式下:輸入:%s/^M//g 然后,回車即可替換
注,其中”^M”的輸入,分別是“Ctrl+v”、“Ctrl+M”鍵生成的
方法2:
使用vi打開文本文件
vi dos.txt
命令模式下輸入
:set fileformat=unix
:w
方法3:
使用sed 工具
sed ’s/^M//’ filename > tmp_filename
方法4:
既然window下的回車符多了‘\r’,那么當然通過刪除‘\r’ ,也可以實現:
tr -d ‘\r’
方法5:(最常用的方法)
在終端下敲命令:
$ dos2unix filename
直接轉換成unix格式,就OK了!~
補充:
將Windows中的文本文件傳到Linux后,會在每行的末尾多出一個^M符號。當進行Shell編程時,該符號可能會導致正則表達式匹配失敗。如果想 去掉這個符號可以使用dos2unix命令。當然如果想恢復為Windows下的模式可以使用unix2dos命令。 當從Windows傳來一個文件時,可以使用vim -b 命令來打開該文件,這樣就能看到行尾的^M符號了,否則是看不到的。
第二部分:以上方法都試過的還不能解決問題的朋友,請看下面的方法
1、在windos下使用Notepad++編輯器,打開shell文件*.sh
2、在“編輯”->”文檔格式轉換”->”轉換為UNIX格式”
3、在“格式”->”以UTF-8無BOM格式編碼”
4、用ssh工具或其他工具將該shell文件導入Linux下
5、chmod +x *.sh,改變shell文件的權限,使之可以執行
至此,就解決我的shell文件的格式問題了,happy day…..