問題:
我在寫了shell文件,創建shell文件sky8g.文件。后使用 chmod +x sky8g.sh給予可執行的權限后再次執行
1 |
chmod +x toutiao_app.sh |
執行shell文件
1 |
./toutiao_app.sh |
出現下面的報錯:
1 |
/bin/bash^M: bad interpreter: No such file or directory |
錯誤介紹
通過上面我們可以看到有個^M個標志,這個標志是:Windows環境下dos格式文件傳輸到unix系統時,會在每行的結尾多一個^M,所以在執行的時候出現了這種現象,但是你在unix或者Linux環境下使用vi編輯的時候,會在下面顯示此文件的格式,比如”sky8g.sh” [dos] 2L,20C字樣,表示這是一個【dos】的格式文件,如果是MAC的系統則會出現【MAC】的字樣,因為文件格式的原因,有時候我們是unix程序或shell程序,則就要把dos文件轉化為unix的文件格式。
錯誤解決辦法
如何解決以上的報錯呢,接下來有4種方法可以解決他。
第一種方式:也是最簡單的方法,直接在當前的文件目錄下執行下面命令
1 |
sed -i -e 's/\r$//' *.sh |
第二方式種:使用unix/Linux中的vi命令,更改fileformat格式
首先執行
1 |
vi *.sh |
使用vi sky8g.sh查看時在最后一行會出現了下面的
1 |
"*.sh" [dos] 2L, 19C |
說明這個文件編碼方式是windows編輯的,必須轉化格式為unix格式 ,按ESC鍵,再次執行下面命令后
1 |
:set ff |
敲回車,出現如下
1 |
fileformat=dos |
修改為下面
1 2 3 |
vi test.sh :set ff=unix :x |
第三種方式 :使用dos2unix和unix2dos命令
Linux提供了兩種文本格式相互轉化的命令:dos2unix和unix2dos,dos2unix把”\r\n”轉化成”\n”,unixtodos把”\n”轉化成”\r\n”。Java程序中,使用 Runtime.getRuntime().exec(“unix2dos “+ fileName);來實現對文本格式互轉命令的調用。多說一句,執行指令前要先看看linux上是否有安裝unix2dos/dos2unix工具
1.首先查看是否安裝了這個工具,使用grep正則使用
1 |
yum list installed | grep -nE 'dos2unix|dos2' |
如果安裝了這個工具,則執行下面命令
1 |
dos2unix sky8g.sh |
出現下面顯示說明轉化ok
1 2 3 |
[root@sky8g back]# dos2unix j.sh dos2unix: converting file j.sh to Unix format ... [root@sky8g back]# |
第四種方式:在編輯代碼的時候設置編輯器的line endings編碼方式
如果你在Windows或Mac上使用sublime文本編輯腳本:單擊View > Line ending > Unix並再次保存文件。例如:
在notepad++中,您可以通過按下按鈕為文件設置它 Edit –> EOL Conversion –> UNIX/OSX Format
為Eclipse用戶,您可以更改文件編碼直接從 File > Convert Line Delimiters To > Unix (LF, \n, 0Α, ¶)
或者更改 Unix on Window > Preferences > General > Workspace panel: