初學shell的時候,總聽到羣裏的大牛說不要使用Windows自帶的notepad編寫shell。然而,一直不解其中的緣由。接下來,我們動手實踐一下,瞭解其中的前因後果。 shell
在Windows下,打開notepad,敲打如下代碼: bash
#! /bin/bash echo "This is the first line \ of the script." echo "This is the second line \ of the script."保存爲test1。而後將這個文件複製到Linux下。打開這個文件,會看到文件的內容與以前在Windows下編輯的文本文件並沒有區別。
在Linux下,使用vi編輯test2文件,加入一樣的內容,而後保存。 工具
接下來,分別運行這兩個文件(注意:運行前先賦予這兩個文件以可執行權限)。對於test2,獲得以下輸出: 操作系統
$ ./test2 This is the first line of the script. This is the second line of the script.對於test1,則獲得這樣的輸出:
$ ./test1 bash: ./test1: /bin/bash^M: bad interpreter: No such file or directory也就是說,在Windows下用notepad編寫的shell運行出錯了。從報錯信息能夠看出,從header這一行就已經出錯了,header這一行原本是要告訴咱們的內核使用Bash這個命令解釋器,它的路徑位於/bin/bash。但是bash卻告訴咱們無此文件。究其緣由,是^M這個字符影響了header一行對於命令解釋器的正常識別。那^M這個字符又是什麼呢?
不用的操做系統使用不一樣的字符來表示換行。Unix/Linux使用單個的換行(Line Feed,LF)符做爲換行的標記。Windows/DOS使用2個字符:回車(Carriage Return,CR)符和換行符(LF)。MacOS使用CR。^M即爲咱們在使用Windows的notepad產生的回車符。更多信息可參見維基百科上關於Newline的解釋:http://zh.wikipedia.org/wiki/%E6%8F%9B%E8%A1%8C code
對於Linux Deepin甚至其餘發行版原本說,一個比較通用的方法是使用tr工具來刪除多餘的回車符,由於它不須要安裝額外的工具,且便於理解。 ip
tr -d '\r' < test1 > tmp && mv tmp test2使用這條命令刪除多餘的回車符後,該腳本便可正常運行。tr是translate或transliterate的縮寫。tr工具從其標準輸入(stdin)中轉換、縮減或刪除字符,並寫道標準輸出(stdout)。其基本句法爲:
tr [options] set1 [set2]在這裏,tr從文件test1中讀入,將其中的回車符(\r)刪除後輸出爲文件tmp,而後又將文件tmp重命名爲test2。對於tr的更多用法,可查看其man page。