久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Cygwin系列(六):使用Cygwin常見問題及應(yīng)對(duì) | silaoA的博客

 看見就非常 2022-02-24

本文共3700余字,,預(yù)計(jì)閱讀時(shí)間13分鐘,,本文同步發(fā)布于知乎(賬號(hào)silaoA)和微信公眾號(hào)平臺(tái)(賬號(hào)偽碼人)。
關(guān)注學(xué)習(xí)了解更多的Cygwin,、Linux技術(shù),。

在本人使用Cygwin/Linux以及與群友、粉絲交流過程中,,有些比較共性的問題,,多次解答采坑背后的原因和應(yīng)對(duì)措施,深感必要對(duì)這些典型的共性問題專門寫文歸納,,本著“折騰自己造福大家”的精神,,寫下此文。

0x00 “未找到命令”

在執(zhí)行某些命令的時(shí)候,,經(jīng)常遇到惱人的“未找到命令”報(bào)錯(cuò),。為何別人教程里可以正常運(yùn)行,到自己這里就不行了呢,?因?yàn)檐浖h(huán)境不同,。
未找到命令報(bào)錯(cuò)未找到命令報(bào)錯(cuò)

Cygwin系列(五):Shell命令行初體驗(yàn)中已介紹過Shell中可以執(zhí)行的指令可分為3類:
內(nèi)建(built-in)命令,僅與Shell自身有關(guān),,不同的Shell(如sh,、bash、zsh,、fish等)支持的內(nèi)建命令,;
用戶定義函數(shù)(function)、別名(alias)等,,用戶可自定義一些Shell函數(shù),,給命名設(shè)置別名等;
外部命令,額外安裝的可執(zhí)行程序越多,,可供執(zhí)行的外部命令就越多,,比如ls就是外部命令。

對(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è)原因:
①未安裝必要的軟件包,命令壓根兒不存在,;
②安裝好了必要的軟件包,,但命令所在的路徑不在PATH變量中。

對(duì)于①,參照教程 Cygwin系列(四):一步一步搭建Cygwin最小系統(tǒng),。對(duì)于②,,可以把下列語句寫在配置文件中,比如~/.bashrc(如果使用的Shell是Bash),、~/.zshrc(如果使用的Shell是zsh),。

1
2
PATH="<你想添加的路徑>:$PATH"
export PATH

也可以合并為一句

1
export PATH="<你想添加的路徑>:$PATH"

上述語句,也可以在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ǔ)上“追加”,。寫成”$PATH:<你想添加的路徑>”的形式也可以,只是Shell搜索的先后順序不同,。
PATH環(huán)境變量PATH環(huán)境變量

Windows系統(tǒng)中同樣也存在PATH環(huán)境變量,,用于cmd查找外部命令。需指出,,Cygwin中Shell的PATH變量值,,與Windows系統(tǒng)的PATH變量值相互獨(dú)立,但是Cygwin中Shell的PATH初始值繼承自Windows系統(tǒng)的PATH變量值,,用戶可以在此基礎(chǔ)上繼續(xù)定義,,這也是為什么在Cygwin的Shell中可以執(zhí)行Windows原生命令的原因!通常,,至少/bin,、/usr/bin/usr/local/bin這些標(biāo)準(zhǔn)路徑都應(yīng)該在Shell的PATH中,。

0x01 換行符

在執(zhí)行Shell腳本時(shí)候,,有時(shí)會(huì)遇到下面的報(bào)錯(cuò),根本的原因是Windows和Linux換行符不兼容,!
“\r”不識(shí)別“\r”不識(shí)別

在機(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ī)CR和LF鍵位(圖片<a name='來源+知乎'></a><font style='color: red'>來源</font>于網(wǎng)絡(luò))打字機(jī)CR和LF鍵位(圖片來源于網(wǎng)絡(luò))

在計(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è)文件顯示為一行,。
cat顯示出行末^M字符cat顯示出行末^M字符
記事本顯示為一行記事本顯示為一行

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ò),。

解決辦法,就是將文本文件中的換行符全局替換掉:

  • dos2unix dos_file,,dos2unix專門用于將'\r\n’替換為'\n’,,有個(gè)與之作用相反的命令是unix2dos,將'\n’替換為'\r\n’,;
  • tr -d '\r’ dos_file > unix_file,,tr本是字符“翻譯(translate)”工具,其中-d選項(xiàng)專門用于刪除特定字符,,處理后的結(jié)果輸出到unix_file,;
  • sed -i 's/^M//g' dos_filesed是行編輯工具,,這條命令是將每行文本的'^M’替換為空,,亦即刪除'^M’,其中'^M’在終端的輸入方式是Ctrl-V(指示后續(xù)按字面含義輸入不轉(zhuǎn)義),,然后Ctrl-M,;
  • Windows平臺(tái)的某些編輯器,如Notepad++,、VS Code,、VIM、Emacs等可以設(shè)置默認(rèn)換行符,,也可以在打開文件后轉(zhuǎn)換為其他換行符保存,;

再扯點(diǎn)換行符在C語言中的實(shí)現(xiàn),比如printf(“Hello, World\n”);這個(gè)語句往標(biāo)準(zhǔn)輸出stdout中打印一句話并使用“\n”換行,,分別在Linux和Windows上編譯源碼并執(zhí)行,,好像并未出現(xiàn)換行符不兼容的問題。事實(shí)是,,C語言中雖然也有轉(zhuǎn)義字符'\r’,、'\n’,但并不保證與ASCII碼CR,、LF等價(jià),,在文本模式下,寫入'\n’由系統(tǒng)底層翻譯成換行符,,讀入文本時(shí)換行符再由系統(tǒng)底層翻譯為'\n’,。UNIX系統(tǒng)正是C語言寫出來的,系統(tǒng)底層就使用LF作換行符,,系統(tǒng)內(nèi)外表示一致不需翻譯,;而MS-DOS,、Windows系統(tǒng)底層,則在系統(tǒng)內(nèi)外需要進(jìn)行'\n’與CR+LF的轉(zhuǎ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è)定的編碼方式不一致,。
建議:各處都使用UTF-8編碼方式,文本換行符統(tǒng)一LF,。

終端的設(shè)置

mintty是Cygwin默認(rèn)的終端,,在頂部鼠標(biāo)右鍵》選項(xiàng),即可看到設(shè)置界面,,其中“文本”就是字體、語言環(huán)境設(shè)置項(xiàng),。
mintty中語言環(huán)境設(shè)置項(xiàng)mintty中語言環(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通過locale程序和一組環(huán)境變量為設(shè)置特定的語言環(huán)境。locale -a命令可列出系統(tǒng)支持的所有語言環(huán)境,。一組環(huán)境變量包括:LANG,、LC_起始的12個(gè)類別(日期時(shí)間、數(shù)字,、電話號(hào)碼,、貨幣等表示習(xí)慣)變量、LC_ALL,,優(yōu)先級(jí)依次降低,。因此在~/.bashrc(如果使用的Shell是Bash)、~/.zshrc(如果使用的Shell是zsh)直接寫好LC_ALL即可,。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#locale設(shè)置,,包含12大類的locale屬性,優(yōu)先級(jí)LC_ALL > LC_*(12個(gè)) >LANG
# LANG
# LC_CTYPE
# LC_NUMERIC
# LC_TIME
# LC_COLLATE
# LC_MONETARY
# LC_MESSAGES
# LC_PAPER
# LC_NAME
# LC_ADDRESS
# LC_TELEPHONE
# LC_MEASUREMENT
# LC_IDENTIFICATION
# LC_ALL
export LC_ALL="zh_CN.UTF-8"

文本編輯器設(shè)置

參照文本編輯器手冊(cè)設(shè)置字符編碼,。

轉(zhuǎn)換工具

有的文本編輯器不僅可以設(shè)置為按照某種字符編碼去解析,、存儲(chǔ)文本,還支持文本在不同字符編碼之間直接轉(zhuǎn)換,。

Linux,、Cygwin上有個(gè)移植GNU的程序——iconv,用于將文本文件從一種字符編碼轉(zhuǎn)換為另一種字符編碼,,對(duì)于Cygwin,,這個(gè)命令在libiconv包中。老規(guī)矩,,看--help選項(xiàng)了解怎么用,。
iconv --help輸出iconv --help輸出

-l選項(xiàng)(list)可以列出支持的所有字符編碼,iconv對(duì)字符編碼有著較嚴(yán)格的名稱約定,,如果在使用時(shí)與之不一致就會(huì)報(bào)錯(cuò),。實(shí)際轉(zhuǎn)換時(shí)最常用的命令為:

1
iconv -f  輸入編碼  -t  輸出編碼  輸入文件 > 輸出文件

默認(rèn)情況下,iconv輸出到stdout,,上述命令將stdout重定向至新文件,。

0x03 怎么安裝軟件包

參照教程 Cygwin系列(四):一步一步搭建Cygwin最小系統(tǒng)

0x04 選哪個(gè)gcc

gcc是源碼編譯構(gòu)建時(shí)必備的命令,,Cygwin的setup中能搜素到多個(gè)包含gcc字樣的軟件包,,那么該選哪個(gè)呢?

gcc早期僅支持c語言,,那時(shí)gcc就單指GNU C Compiler,,后來gcc支持了c以外的c++、fortran,、object-c等編程語言,,就演變?yōu)橹复鶪NU Compiler Collection,。Cygwin中,有關(guān)gcc的軟件包被分拆為核心組件包gcc-core(僅支持c語言)和語言支持包如gcc-g++,、gcc-fortran,、gcc-adagcc-objc,、gcc-objc++等多個(gè),。
Cygwin中有關(guān)gcc的軟件包Cygwin中有關(guān)gcc的軟件包

再介紹兩種編譯構(gòu)建方式:
原生(native)編譯構(gòu)建,即編譯構(gòu)建命令所運(yùn)行(host)的系統(tǒng)環(huán)境和編譯構(gòu)建輸出目標(biāo)(target)的系統(tǒng)環(huán)境一致,;
交叉(cross)編譯構(gòu)建,,上述target和host不一致,即在A系統(tǒng)環(huán)境構(gòu)建出在B系統(tǒng)上運(yùn)行的目標(biāo),,這在嵌入式開發(fā)中尤為多見,。

系統(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)境前綴,,比如x86_64-pc-cygwin-gcc,、x86_64-unknown-cygwin-pkg-config等。

native和cross方式編譯構(gòu)建所需的軟件包自然不一樣,。因此,,如果是要native構(gòu)建,直接找gcc-core,、gcc-g++就對(duì)了,;如果是要cross構(gòu)建,比如在Cygwin上構(gòu)建出Windows原生程序,,選mingw64-i686-gcc-core,、mingw64-i686-gcc-g++等或者mingw64-x86_64-gcc-coremingw64-x86_64-gcc-g++等,,其中mingw64-i686mingw64-x86_64指示target系統(tǒng)環(huán)境。

除了gcc,,還有其他的開發(fā)工具類軟件包,,比如binutilsllvm,、qt4,、qt5等,在Cygwin中既有給native構(gòu)建使用的,,也有給cross構(gòu)建使用的,。

未完待續(xù)篇,。

參考

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多