本文共3700余字,,預(yù)計(jì)閱讀時(shí)間13分鐘,,本文同步發(fā)布于知乎(賬號(hào)silaoA)和微信公眾號(hào)平臺(tái)(賬號(hào)偽碼人)。 在本人使用Cygwin/Linux以及與群友、粉絲交流過程中,,有些比較共性的問題,,多次解答采坑背后的原因和應(yīng)對(duì)措施,深感必要對(duì)這些典型的共性問題專門寫文歸納,,本著“折騰自己造福大家”的精神,,寫下此文。 0x00 “未找到命令”在執(zhí)行某些命令的時(shí)候,,經(jīng)常遇到惱人的“未找到命令”報(bào)錯(cuò),。為何別人教程里可以正常運(yùn)行,到自己這里就不行了呢,?因?yàn)檐浖h(huán)境不同,。 Cygwin系列(五):Shell命令行初體驗(yàn)中已介紹過Shell中可以執(zhí)行的指令可分為3類: 對(duì)于用戶的輸入,,Shell按照②①③的順序依次查找匹配命令名稱,,一旦匹配就執(zhí)行該命令(執(zhí)行是否成功是下一步的事情暫忽略),即使可能有多個(gè)匹配結(jié)果也不再繼續(xù)匹配,,如果無法找到就報(bào)錯(cuò)“未找到命令”,。內(nèi)建命令的名稱是固定的,,用戶自定義的別名,、函數(shù)等,在Shell加載完配置文件后也是固定的,,而外部命令則是不可預(yù)期的,,Shell到哪里去找呢?答案是PATH環(huán)境變量,。 為讓用戶靈活使用Shell以及在Shell中運(yùn)行其他命令,,Shell允許用戶定制一組變量,稱為“環(huán)境變量”,,PATH是其中之一,。PATH值是一組路徑,路徑之間用“:”分隔,,Shell就是根據(jù)PATH的值逐個(gè)路徑依次搜索外部命令名稱,,一旦匹配就執(zhí)行,即使可能有多個(gè)匹配結(jié)果也不再繼續(xù)匹配,。值得注意的是,,出于安全考慮,當(dāng)前路徑“.”強(qiáng)烈不建議寫入PATH中,,經(jīng)常有人cd到某個(gè)路徑下再輸入“xxx”,,雖然明明看到xxx就在這個(gè)路徑下,結(jié)果很遺憾Shell仍然報(bào)錯(cuò)“未找到命令”,,正確的姿勢(shì)應(yīng)該是cd到這個(gè)路徑后輸入“./xxx”,,也可以不cd,輸入命令時(shí)把文件路徑寫全,。 回到問題本身,,未找到命令無外乎兩個(gè)原因: 對(duì)于①,參照教程 Cygwin系列(四):一步一步搭建Cygwin最小系統(tǒng),。對(duì)于②,,可以把下列語句寫在配置文件中,比如
也可以合并為一句
上述語句,也可以在Shell中輸一遍,,但是只對(duì)本次Shell會(huì)話有效,,終端關(guān)了下次就不起作用。寫入配置文件的話,,每次打開終端運(yùn)行Shell,,Shell會(huì)自動(dòng)讀取。為什么上述語句不是單單寫要添加的路徑完事,,而是要在末尾添加“$PATH”呢,?解釋一下,PATH這個(gè)變量系統(tǒng)中可能有多處設(shè)置,,我們不能在添加自定義路徑時(shí)把原有值覆蓋掉了,,導(dǎo)致系統(tǒng)工作不正常,“$PATH”就是對(duì)原有值的引用,,即在原有值基礎(chǔ)上“追加”,。寫成 Windows系統(tǒng)中同樣也存在PATH環(huán)境變量,,用于 0x01 換行符在執(zhí)行Shell腳本時(shí)候,,有時(shí)會(huì)遇到下面的報(bào)錯(cuò),根本的原因是Windows和Linux換行符不兼容,! 在機(jī)械打字機(jī)時(shí)代,,打字機(jī)上有個(gè)“打印頭(print head)”的零部件,,打印時(shí)從左往右自動(dòng)移動(dòng),滿一行時(shí)需要手動(dòng)推到最左邊,,這個(gè)動(dòng)作叫“回車(Carriage Return)”,,同時(shí)卷軸需要向上卷使紙張上移一行,打印頭相對(duì)于紙張就是下移一行,,這個(gè)動(dòng)作叫做“移行(Line Feed)”,。 在計(jì)算機(jī)發(fā)明早期,電傳打字機(jī)鍵盤上仍有這2個(gè)鍵位,,在終端操作光標(biāo)就類似于在打字機(jī)上操作打字頭,。ANSI標(biāo)準(zhǔn)規(guī)定,轉(zhuǎn)義字符“\r”指代CR,,“\n”指代LF,,計(jì)算機(jī)系統(tǒng)早期廣泛采用CR+LF指示換行。UNIX系統(tǒng)時(shí)代存儲(chǔ)資源很貴,,僅采用1個(gè)字符“\n”指示換行,,而MS-DOS出于兼容性采用“\r\n”指示換行,后來搬到了Windows上,,而Mac系統(tǒng)則采用“\r”指示換行,Linux,、Cygwin照搬了“\n”,。于是,主流的幾大系統(tǒng)上換行符各不相同,?!癨r\n”換行的文本文件在Windows顯示正常,在UNIX,、Linux,、Cygwin中行末多出1個(gè)“^M”,“^M”指真實(shí)的Ctrl-M組合字符,;“\n”換行的文本文件在UNIX,、Linux、Cygwin顯示正常,,在Windows中整個(gè)文件顯示為一行,。 Shell在逐行分析內(nèi)容時(shí),遇到“\n”,,認(rèn)為是一行內(nèi)容結(jié)束,。對(duì)于“\r\n”換行的文本,解析過程中發(fā)現(xiàn),,“\r”就在行末,,既不是關(guān)鍵字,也不是命令或者參數(shù)什么的,只能當(dāng)作是不識(shí)別字符了,,于是報(bào)錯(cuò),。 解決辦法,就是將文本文件中的換行符全局替換掉:
再扯點(diǎn)換行符在C語言中的實(shí)現(xiàn),比如 0x02 文件/終端顯示亂碼字符編碼屬計(jì)算機(jī)公共基礎(chǔ)知識(shí),,網(wǎng)上有足夠多的教程,推薦阮一峰大神的博客 字符編碼筆記:ASCII,,Unicode 和 UTF-8,,由淺入深通俗易懂。 如果文本中僅含ASCII碼字符,,其他字符編碼一般保持著對(duì)ASCII碼兼容性而不會(huì)出現(xiàn)亂碼,;如果含有其他字符,必然要用超出ASCII表示范圍的字符編碼,,比如中文常用的GB2312,、GBK、UTF-8等,。 文件顯示亂碼的根本原因是:文件保存使用的編碼方式和解讀時(shí)使用的編碼方式不一致,!終端顯示亂碼的根本原因是:被操作文件的編碼方式、程序輸出流的編碼方式,、終端設(shè)定的編碼方式不一致,。 終端的設(shè)置mintty是Cygwin默認(rèn)的終端,,在頂部鼠標(biāo)右鍵》選項(xiàng),即可看到設(shè)置界面,,其中“文本”就是字體、語言環(huán)境設(shè)置項(xiàng),。 系統(tǒng)(Shell)的設(shè)置Linux,、Cygwin是支持多語言環(huán)境的系統(tǒng),語言環(huán)境由語言,、地區(qū),、字符集三元組合唯一指示,命名規(guī)則為“<語言>_<地區(qū)>.<字符集編碼>”,,比如zh_CN.UTF-8,,zh表示中文,CN指中國(guó)大陸地區(qū),,UTF-8指使用UTF-8字符編碼,;en_US.UTF-8,en表示英語,,US指美國(guó),。 Linux,、Cygwin通過
文本編輯器設(shè)置參照文本編輯器手冊(cè)設(shè)置字符編碼,。 轉(zhuǎn)換工具有的文本編輯器不僅可以設(shè)置為按照某種字符編碼去解析,、存儲(chǔ)文本,還支持文本在不同字符編碼之間直接轉(zhuǎn)換,。 Linux,、Cygwin上有個(gè)移植GNU的程序——
默認(rèn)情況下, 0x03 怎么安裝軟件包參照教程 Cygwin系列(四):一步一步搭建Cygwin最小系統(tǒng)。 0x04 選哪個(gè)gcc
再介紹兩種編譯構(gòu)建方式: 系統(tǒng)環(huán)境指的什么?GNU的構(gòu)建工具鏈中使用CPU指令集架構(gòu),、廠商,、系統(tǒng)內(nèi)核的三元組合來指示系統(tǒng)環(huán)境,很多構(gòu)建工具的名稱都帶上了這個(gè)系統(tǒng)環(huán)境前綴,,比如 native和cross方式編譯構(gòu)建所需的軟件包自然不一樣,。因此,,如果是要native構(gòu)建,直接找 除了 未完待續(xù)篇,。 參考
|
|