詳解Shell腳本中^M的問題和解決方案
在開發(fā)過程中,有時候不小心將Windows本地創(chuàng)建的shell腳本(以 .sh 結(jié)尾的腳本),傳到linux系統(tǒng)中,通過 vi或者view命令查看文件時,發(fā)現(xiàn)在末尾發(fā)現(xiàn)出現(xiàn)了很多^M字符。
^M 是什么?
這個字符就是換行符。是由于跨平臺解析的原因。
因為window和Linux下對行尾的換行的定義不同
Windows: \r\n
Linux/Unix: \n
Mac: \r
例子
出現(xiàn)的原因:
在DOS/Windows里,文本文件的換行符為\r\n,而在nix系統(tǒng)里則為\n,所以DOS/Windows里編輯過的文本文件到了nix里,每一行都多了個^M
導(dǎo)致的問題:
腳本可能無法正常執(zhí)行,影響程序正常使用
臨時解決方案1:
如果需要從表面上修改,只需使用替換命令就能將該字符給取消;#:%s/^M//g
臨時解決方案2:
在linux上創(chuàng)建一個文件,名稱為 xxx.sh,將這個問價下載到本地,然后將腳本內(nèi)容粘貼進(jìn)去,重新上傳到linux上打開查看。
補(bǔ):解決方法
如果需要轉(zhuǎn)換,我們只需要轉(zhuǎn)換文件格式即可。你可以選擇直接在服務(wù)器上調(diào)整。包括如下三種方式。
(1)使用linux命令dos2unix filename,直接把文件轉(zhuǎn)換為unix格式
(2)使用sed命令sed -i "s/\r//" filename 或者 sed -i "s/^M//" filename直接替換結(jié)尾符為unix格式
(3)vi filename打開文件,執(zhí)行 : set ff=unix 設(shè)置文件為unix,然后執(zhí)行:wq,保存成unix格式。
本質(zhì)原因
跨平臺造成的編碼格式問題。其實這個是歷史遺留問題,根本原因就是對換行符的內(nèi)存組成問題。在unix操作系統(tǒng)下的換行符格式為0A(ascii碼),而dos格式下的換行符為 0D 0A(也就是),其實就顯示為^M了。并且對于這個原因,也是有歷史的。
unix將換行符的字符形式給轉(zhuǎn)變了,然而,dos命令下任然保留著傳統(tǒng)的表達(dá)方式;所以以后在進(jìn)行跨平臺開發(fā)的時候,前提就是考慮是否兼容,是否編碼格式兼容這些基本的前提條件。
歷史來源:
早期的計算機(jī)輸出設(shè)備不是顯示器,而是電傳打字機(jī),結(jié)構(gòu)與普通的打字機(jī)差不多。有一個打印頭在紙上打字,同時有一個電動機(jī)控制紙張的進(jìn)出。當(dāng)打印頭到達(dá)行尾的時候,需要兩個動作才能夠到達(dá)下一行的行首:首先執(zhí)行回車動作,將打印頭移動到本行的行首,然后進(jìn)行換行動作,電動機(jī)將紙張向上移動一行,這樣打印頭就處于下一行的行首,可以繼續(xù)進(jìn)行打印?;剀嚭蛽Q行對應(yīng)的控制字符分別是\r和\n,這就是windows中換行符為\r\n的由來。后來由于經(jīng)常連續(xù)執(zhí)行,所以在打印機(jī)中將這兩個控制字符簡化為一個控制字符,這就是Linux/Unix中的換行符\n的由來。
常用工具
dos2unix 將window下文本文件轉(zhuǎn)成符合Linux系統(tǒng)要求的文件
unix2dos 與上面的命令的作用相反
到此這篇關(guān)于詳解Shell腳本中^M的問題和解決方案的文章就介紹到這了,更多相關(guān)Shell ^M問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux shell數(shù)組與關(guān)聯(lián)數(shù)組的用法實例
今天小編就為大家分享一篇關(guān)于Linux shell數(shù)組與關(guān)聯(lián)數(shù)組的用法實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02Shell 命令啟動Docker Container的實現(xiàn)
本文主要介紹了Shell 命令啟動Docker Container的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02linux 創(chuàng)建守護(hù)進(jìn)程的相關(guān)知識
這篇文章主要介紹了linux 創(chuàng)建守護(hù)進(jìn)程的相關(guān)知識,需要的朋友可以參考下2014-01-01Linux各項目環(huán)境部署記錄(換服務(wù)器部署腳本整理)
每次換便宜的服務(wù)器都要導(dǎo)致環(huán)境重新部署一遍,十分麻煩,于是把每次部署的腳本整理了一下,方便在服務(wù)器上快速進(jìn)行部署,基于?CentOS2023-05-05linux定時任務(wù)crontab 實現(xiàn)每秒執(zhí)行一次的方法
linux crontab 命令,最小的執(zhí)行時間是一分鐘。這篇文章主要介紹了linux定時任務(wù)crontab 實現(xiàn)每秒執(zhí)行一次的方法,需要的朋友可以參考下2018-03-03