詳談爲什麼不要使用Windows的notepad編寫shell

初學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。
相關文章
相關標籤/搜索