!/bin/bash: No such file or directory 解決方案


本人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//gMMCtrl+vCtrl+mM代表匹配行尾的內容,最后的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…..


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM