亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2532 | 回復(fù): 7
打印 上一主題 下一主題

[其他] bash命令處理的12個步驟疑問 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-09-04 12:54 |只看該作者 |倒序瀏覽
bash命令處理的12個步驟:
1、將命令行分成由固定元字符集分隔的記號;
SPACE, TAB, NEWLINE, ; , (, ), <, >, |, &

記號類型包括單詞,關(guān)鍵字,I/O重定向符和分號。

2、檢測每個命令的第一個記號,查看是否為不帶引號或反斜線的關(guān)鍵字。

如果是一個開放的關(guān)鍵字,如if和其他控制結(jié)構(gòu)起始字符串,function,{或(,則命令實際上為一復(fù)合命令。shell在內(nèi)部對復(fù)合命令進(jìn)行處理,讀取下一個命令,并重復(fù)這一過程。如果關(guān)鍵字不是復(fù)合命令起始字符串(如then等一個控制結(jié)構(gòu)中間出現(xiàn)的關(guān)鍵字),則給出語法錯誤信號。

3、依據(jù)別名列表檢查每個命令的第一個關(guān)鍵字;

如果找到相應(yīng)匹配,則替換其別名定義,并退回第一步;否則進(jìn)入第4步。該策略允許遞歸別名,還允許定義關(guān)鍵字別名。如alias procedure=function

4、執(zhí)行大括號擴展,例如a{b,c}變成ab ac


5、如果~位于單詞開頭,用$HOME替換~。

使用usr的主目錄替換~user。

6、對任何以符號$開頭的表達(dá)式執(zhí)行參數(shù)(變量)替換;


7、對形式$(string)的表達(dá)式進(jìn)行命令替換;

這里是嵌套的命令行處理。

8、計算形式為$((string))的算術(shù)表達(dá)式;


9、把行的參數(shù),命令和算術(shù)替換部分再次分成單詞,這次它使用$IFS中的字符做分割符而不是步驟1的元字符集;
10、對出現(xiàn)*, ?, [ / ]對執(zhí)行路徑名擴展,也稱為通配符擴展;
11、按命令優(yōu)先級表(跳過別名),進(jìn)行命令查尋;
12、設(shè)置完I/O重定向和其他操作后執(zhí)行該命令


一個命令分步處理的結(jié)果:
Further assume that a file exists called .hist537 in user alice's home directory, which is /home/alice, and that there is a double-dollar-sign variable $$ whose value is 2537 (we'll see what this special variable is in the next chapter).

Now let's see how the shell processes the following command:

ll $(type -path cc) ~alice/.*$(($$%1000))


Here is what happens to this line:

1.  ll $(type -path cc) ~alice/.*$(($$%1000)) splits the input into words.

2.  ll is not a keyword, so Step 2 does nothing.

3.  ls -l $(type -path cc) ~alice/.*$(($$%1000)) substitutes ls -l for its alias "ll". The shell then repeats Steps 1 through 3; Step 2 splits the ls -l into two words.

4.  ls -l $(type -path cc) ~alice/.*$(($$%1000)) does nothing.

5.  ls -l $(type -path cc) /home/alice/.*$(($$%1000)) expands ~alice into /home/alice.

6.  ls -l $(type -path cc) /home/alice/.*$((2537%1000)) substitutes 2537 for $$.

7.  ls -l /usr/bin/cc /home/alice/.*$((2537%1000)) does command substitution on "type -path cc".

8.  ls -l /usr/bin/cc /home/alice/.*537 evaluates the arithmetic expression 2537%1000.

9.  ls -l /usr/bin/cc /home/alice/.*537 does nothing.

10. ls -l /usr/bin/cc /home/alice/.hist537 substitutes the filename for the wildcard expression .*537.

11. The command ls is found in /usr/bin.

12./usr/bin/ls is run with the option -l and the two arguments.

Although this list of steps is fairly straightforward, it is not the whole story. There are still five ways to modify the process: quoting; using command, builtin, or enable; and using the advanced command eval.


結(jié)合上面的例子,對bash命令處理的12個步驟有了進(jìn)一步的理解,但是還存在一些疑惑,求大師們解答啊~

1.針對步驟一中的固定元字符集中包含 (, ), 例子中的$(type -path cc)并沒有被分割成兩個記號(token),從步驟7處理時把$(type -path cc)當(dāng)成一個記號(token)可以看出
2.記號類型中:單詞我理解的是包含命令,如echo;普通字符串,如a=123,關(guān)鍵字我理解的就是if,for,while等需要結(jié)合其他的字符進(jìn)行操作的具有特定含義的字符串;但是不太理解做為固定元字符的I/O重定向符和分號是怎么又做為token的呢??

論壇徽章:
0
2 [報告]
發(fā)表于 2014-09-04 14:16 來自手機 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽

論壇徽章:
0
3 [報告]
發(fā)表于 2014-09-04 16:39 |只看該作者
本帖最后由 siyecaoliu 于 2014-09-04 16:40 編輯

一起學(xué)習(xí)!!!
求大神們答疑解惑啊,難道大家都沒有看到問題嗎???

回復(fù) 2# chenzhiquan2000


   

論壇徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年紀(jì)念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役紀(jì)念章
日期:2022-04-24 14:33:24
4 [報告]
發(fā)表于 2014-09-04 17:20 |只看該作者
1、我認(rèn)為 $(type -path cc) 已經(jīng)被分割了,它就是按照元字符把命令分割成token,至于這些token組合起來表達(dá)什么意思(命令替換、算數(shù)運算等)它根本不關(guān)心。

論壇徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役紀(jì)念章
日期:2018-05-14 11:05:0715-16賽季CBA聯(lián)賽之北控
日期:2018-05-14 11:05:0015-16賽季CBA聯(lián)賽之江蘇
日期:2017-02-27 18:11:0715-16賽季CBA聯(lián)賽之上海
日期:2018-08-15 09:48:5415-16賽季CBA聯(lián)賽之佛山
日期:2018-07-20 17:14:2315-16賽季CBA聯(lián)賽之佛山
日期:2019-09-10 18:08:4615-16賽季CBA聯(lián)賽之山西
日期:2020-03-26 09:40:5115-16賽季CBA聯(lián)賽之佛山
日期:2020-05-08 09:03:54
5 [報告]
發(fā)表于 2014-09-04 17:53 |只看該作者
本帖最后由 chengchow 于 2014-09-04 17:54 編輯

看標(biāo)題當(dāng)成普及貼了,學(xué)習(xí)了,這塊還真沒了解過,隨便說說了

$(type -path cc)應(yīng)該是被看作了一個整體,$改變了后面()的含義,這里并沒有做分隔,所以做運算的時候需要$(())
重定向和;已經(jīng)不屬于一個命令的范疇了,所以這里并沒有說明。

論壇徽章:
0
6 [報告]
發(fā)表于 2014-09-04 19:45 |只看該作者
謝謝大神解答~
應(yīng)該是大神說的這樣,原想著現(xiàn)在把命令行拆分成了記號(token),下面的操作步驟就是以記號(token)為處理單元了,應(yīng)該是自己想多了,下面的處理步驟確實沒說一定要以記號(token)為處理單元,即使下面是以記號(token)為處理單元,也可以將步驟6、7、8以$開頭的情況做為特殊情況處理~
回復(fù) 4# Shell_HAT


   

論壇徽章:
0
7 [報告]
發(fā)表于 2014-09-04 19:57 |只看該作者
看來標(biāo)題名起錯了,可是改不了呢
謝謝chengchow君的解答~
問題1我還是比較贊同HAT大神的說法,問題2中我覺得可能是因為;是命令之間的分隔符所以要作為一個特殊的記號;而重定向應(yīng)該還是屬于一個命令的范疇吧,只是可能由于步驟12提到的要預(yù)先設(shè)置i/o重定向,所以才作為一個特殊記號標(biāo)識出來~ 我也是胡猜的,如有錯誤,還請大神幫忙指正,勿噴啊
回復(fù) 5# chengchow


   

論壇徽章:
5
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亞洲杯之朝鮮
日期:2015-03-13 22:47:33IT運維版塊每日發(fā)帖之星
日期:2016-01-09 06:20:00IT運維版塊每周發(fā)帖之星
日期:2016-03-07 16:27:44
8 [報告]
發(fā)表于 2014-09-05 09:21 |只看該作者
token word 就是字符串,可以包括任何東西。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP