小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

linux中的組命令和子shell

 ala咪s 2017-08-16
 
 

組命令和子shell

在bash中,有兩種方式可以將命令組合到一起,一種是組命令,另一種是子shell。格式如下:

# 組命令
{ commnad1; command2; [ command3.. ] }
# 子shell
(command1; command2; [command3..])
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

上面兩種形式的差別在于:1.組命令使用花括號(hào)括起來,前花括號(hào)和后花括號(hào)與命令之間要有一個(gè)空格,并且閉合花括號(hào)前要用分號(hào)或換行結(jié)束命令。2.對(duì)于子shell,只需要用圓括號(hào)包圍即可。

執(zhí)行重定向

那么,組命令和子shell有什么用途呢?盡管它們有一個(gè)主要的區(qū)別,但是它們都可以用來管理重定向。下面請(qǐng)看這個(gè)例子:

[fbap:/home/fbap/usertmp]>ls -l > output.txt
[fbap:/home/fbap/usertmp]>echo "hello world" >> output.txt
[fbap:/home/fbap/usertmp]>cat foo.txt >> output.txt
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

顯然,上面的3條命令將輸出重定向到output.txt。使用組命令,可以將它們合并成一行:

{ ls -l; echo "hello world"; cat foo.txt; } > output.txt
  • 1
  • 1

當(dāng)然,你也可以使用子shell的方式:

(ls -l; echo "hello world"; cat foo.txt;) > output.txt
  • 1
  • 1

在上面的例子中,使用組命令和子shell可以減少一些輸入。但是,組命令和子shell真正有價(jià)值的地方在于管道的使用。當(dāng)創(chuàng)建命令管道時(shí),通常將多條命令的結(jié)果輸出到一條流中,這很有用。

{ ls -l; echo "hello world"; cat foo.txt; } | lpr
  • 1
  • 1

這里,我們將3個(gè)命令的輸出進(jìn)行合并,并通過管道輸出到lpr的輸入以產(chǎn)生一個(gè)打印報(bào)告。

進(jìn)程替換

雖然組命令和子shell看起來很相似,都可以用來為重定向整合流,但是,它們有一處主要的不同。子shell(正如其名字)在當(dāng)前shell的子拷貝中執(zhí)行命令,而組命令則是直接在當(dāng)前shell中執(zhí)行所有命令。這以為子shell會(huì)復(fù)制當(dāng)前環(huán)境變量以創(chuàng)建一個(gè)新的shell實(shí)例。當(dāng)子shell退出時(shí),復(fù)制的環(huán)境變量也就消失了,因此對(duì)任何子shell(包括變量賦值)的改變也同樣丟失了。所以,大多數(shù)情況下,除非腳本需要子shell,否則使用組命令比子shell更快,占用內(nèi)存也更少。

請(qǐng)看下面的例子:

echo 'foo' | read 
echo $REPLY
  • 1
  • 2
  • 1
  • 2

在上面的例子中,REPLY的內(nèi)容總是空的,因?yàn)閞ead命令是在子shell中執(zhí)行的,并且當(dāng)子shell終止的時(shí)候,REPLY的拷貝也遭到了破壞。

很幸運(yùn)的是,shell提供了一種叫做進(jìn)程替換的外部擴(kuò)展方式來解決這個(gè)問題。

實(shí)現(xiàn)進(jìn)程替換的方式有兩種:

# 產(chǎn)生標(biāo)準(zhǔn)輸出的進(jìn)程
<(list) 

# 吸納標(biāo)準(zhǔn)輸入的命令
>(list)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

為了解決上述read命令的問題,我們可以像這樣使用進(jìn)程替換:

read < <(echo "foo")
echo $REPLY
  • 1
  • 2
  • 1
  • 2

進(jìn)程替換允許將子shell當(dāng)成普通的文件,目的是為了重定向。事實(shí)上,這是一種擴(kuò)展形式,我們可以查看它的真實(shí)值。

[fbap:/home/fbap]>echo <(echo "foo")
/dev/fd/63
  • 1
  • 2
  • 1
  • 2

通過使用echo查看擴(kuò)展結(jié)果,可以看到文件/dev/fd/63正為子shell提供輸出。

以下是一個(gè)讀循環(huán)的實(shí)例,該實(shí)例用循環(huán)處理子shell創(chuàng)建的目錄列表的內(nèi)容:

#!/bin/bash

# 注:
#   1.如果將此處的內(nèi)容另存為一個(gè)腳本如sub-proc.sh,但是如果像這樣執(zhí)行腳本:sh sub-proc.sh,shell將報(bào)錯(cuò)syntax error(語(yǔ)法錯(cuò)誤)。
# 
# 正確的執(zhí)行方式是:
#   1)腳本添加可執(zhí)行權(quán)限: chmod u+x sub-proc.sh
#   2)使用相對(duì)(絕對(duì))路徑: ./sub-proc.sh

while read attr links owner group size date_1 date_2 year filename 
do
    cat <<EOF
        文件名:   ${filename}
        大小:     ${size}
        擁有者:   ${owner}
        屬性:     ${attr}
EOF
    echo "======================="
done < <(ls -l | tail -n +2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

執(zhí)行命令:./sub-proc.sh | head -n 10,得到如下輸出:

[fbap:/home/fbap/usertmp]>./sub*sh|head -n 10
        文件名:   AFA_TEST_NEWADM.ixf
        大小:     4783
        擁有者:   fbap
        屬性:     -rw-rw-r--.
=======================
        文件名:   all_python_files.log
        大小:     1168088
        擁有者:   fbap
        屬性:     -rw-rw-r--.
=======================

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(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)論公約

    類似文章 更多