網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
在開發(fā)過程中,有時(shí)候不小心將Windows本地創(chuàng)建的shell腳本(以 .sh 結(jié)尾的腳本),傳到linux系統(tǒng)中,通過 vi或者view命令查看文件時(shí),發(fā)現(xiàn)在末尾發(fā)現(xiàn)出現(xiàn)了很多^M字符。
^M 是什么?
這個(gè)字符就是換行符。是由于跨平臺(tái)解析的原因。
因?yàn)閣indow和Linux下對(duì)行尾的換行的定義不同
Windows: \r\n
Linux/Unix: \n
Mac: \r
例子
出現(xiàn)的原因:
在DOS/Windows里,文本文件的換行符為\r\n,而在nix系統(tǒng)里則為\n,所以DOS/Windows里編輯過的文本文件到了nix里,每一行都多了個(gè)^M
導(dǎo)致的問題:
腳本可能無(wú)法正常執(zhí)行,影響程序正常使用
臨時(shí)解決方案1:
如果需要從表面上修改,只需使用替換命令就能將該字符給取消;#:%s/^M//g
臨時(shí)解決方案2:
在linux上創(chuàng)建一個(gè)文件,名稱為 xxx.sh,將這個(gè)問價(jià)下載到本地,然后將腳本內(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ì)原因
跨平臺(tái)造成的編碼格式問題。其實(shí)這個(gè)是歷史遺留問題,根本原因就是對(duì)換行符的內(nèi)存組成問題。在unix操作系統(tǒng)下的換行符格式為0A(ascii碼),而dos格式下的換行符為 0D 0A(也就是),其實(shí)就顯示為^M了。并且對(duì)于這個(gè)原因,也是有歷史的。
unix將換行符的字符形式給轉(zhuǎn)變了,然而,dos命令下任然保留著傳統(tǒng)的表達(dá)方式;所以以后在進(jìn)行跨平臺(tái)開發(fā)的時(shí)候,前提就是考慮是否兼容,是否編碼格式兼容這些基本的前提條件。
歷史來(lái)源:
早期的計(jì)算機(jī)輸出設(shè)備不是顯示器,而是電傳打字機(jī),結(jié)構(gòu)與普通的打字機(jī)差不多。有一個(gè)打印頭在紙上打字,同時(shí)有一個(gè)電動(dòng)機(jī)控制紙張的進(jìn)出。當(dāng)打印頭到達(dá)行尾的時(shí)候,需要兩個(gè)動(dòng)作才能夠到達(dá)下一行的行首:首先執(zhí)行回車動(dòng)作,將打印頭移動(dòng)到本行的行首,然后進(jìn)行換行動(dòng)作,電動(dòng)機(jī)將紙張向上移動(dòng)一行,這樣打印頭就處于下一行的行首,可以繼續(xù)進(jìn)行打印。回車和換行對(duì)應(yīng)的控制字符分別是\r和\n,這就是windows中換行符為\r\n的由來(lái)。后來(lái)由于經(jīng)常連續(xù)執(zhí)行,所以在打印機(jī)中將這兩個(gè)控制字符簡(jiǎn)化為一個(gè)控制字符,這就是Linux/Unix中的換行符\n的由來(lái)。
常用工具
dos2unix 將window下文本文件轉(zhuǎn)成符合Linux系統(tǒng)要求的文件
unix2dos 與上面的命令的作用相反
原文鏈接:https://blog.csdn.net/csdnjsj/article/details/108722814
相關(guān)推薦
- 2023-07-28 ElementUI el-tabs切換之前判斷是否滿足切換條件 不滿足條件僅提示不切換Tab
- 2023-09-12 利用Map結(jié)合Supplier消除switch...case
- 2022-10-01 Python類和對(duì)象基礎(chǔ)入門介紹_python
- 2022-12-07 react?app?rewrited替代品craco使用示例_React
- 2022-07-28 Django實(shí)現(xiàn)視頻播放的具體示例_python
- 2022-09-06 Django的restframework接口框架自定義返回?cái)?shù)據(jù)格式的示例詳解_python
- 2022-07-21 C語(yǔ)言詳細(xì)講解if語(yǔ)句與switch語(yǔ)句的用法_C 語(yǔ)言
- 2022-09-21 Android?Intent傳遞大量數(shù)據(jù)出現(xiàn)問題解決_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支