3 Bash
3.5 Chuyeˆ’n hu’o´’ng d¯aˆ`u vào/d¯aˆ`u ra, d¯u’o`’ng oˆ´ng và d¯aˆ`u lo
˙c 31
kênh giao tác
[user]$ echo ’xin chao cac ban!’
Tôi nghı˜ ra˘`ng lo`’i gia’i thích se˜ là thu`’a thãi (chı’ xin hãy su’’ du
˙ng daˆ´u ngoa˘
˙c d¯o’n, neˆ´u không keˆ´t qua’ có theˆ’ se˜ khác. Neˆ´u ba
˙n d¯o
˙c chú ý thì có theˆ’ gia’i thích ta
˙i sao la˙i khác).
3.4.3 Leˆ
˙nh cat
Chúng ta se˜ xem xét leˆ
˙nhcato’’ d¯ây vì leˆ
˙nh này thu’o`’ng làm vieˆ
˙c vo´’i d¯aˆ`u vào và d¯aˆ`u ra tiêu chuaˆ’n. Theo ma˘
˙c d¯i
˙nh keˆ´t qua’ làm vieˆ
˙c cu’a leˆ
˙nhcathu’o´’ng to´’i d¯aˆ`u ra tiêu chuaˆ’n. D¯ eˆ’ chu´’ng minh là leˆ
˙nh này theo ma˘˙c d¯i
˙nh tieˆ´p nhaˆ
˙n dòng du˜’ lieˆ ˙u nhaˆ
˙p vào, hãy cha˙y leˆ
˙nhcatkhông có tham soˆ´ . Keˆ´t qua’ là con tro’ chuyeˆ’n to´’i moˆ
˙t dòng mo´’i, và ho’n nu˜’a có ve’ nhu’ không có gì xa’y ra. Lúc này câu leˆ
˙nh cho`’ các ký tu
˙’ d¯eˆ´ n tu`’d¯aˆ`u vào tiêu chuaˆ’n. Hãy nhaˆ
˙p baˆ´t ky` ký tu ˙’ nào, và nó se˜ xuaˆ´t hieˆ
˙n ngay laˆ
˙p tu´’c trên màn hình, tu´’c là chu’o’ng trình ngay laˆ
˙p tu´’c d¯u’a chúng to´’i d¯aˆ`u ra tiêu chuaˆ’n. Có theˆ’ tieˆ´p tu
˙c nhaˆ
˙p các ký tu˙’, và chúng cu˜ng se˜ xuaˆ´ t hieˆ
˙n trên màn hình. Thông thu’o`’ng bàn phím d¯u’o
˙’c caˆ´ u hình d¯eˆ’ nhaˆ
˙p vào theo tu`’ng dòng, vì theˆ´ neˆ´u ba
˙n nhaˆ´n phím <Enter>, dòng ký tu
˙’ ba˙n vu`’a nhaˆ
˙p se˜ d¯u’o
˙’c d¯u’a to´’i leˆ˙nhcat, và leˆ
˙nh này se˜ la
˙i d¯u’a du˜’ lieˆ ˙u ra
màn hình thông qua d¯aˆ`u ra tiêu chuaˆ’n. Nhu’ vaˆ
˙y, moˆ˜i dòng ký tu
˙’ nhaˆ˙p vào se˜ d¯u’o
˙’c hieˆ˙n ra hay laˆ`n: moˆ
˙t laˆ`n khi gõ và laˆ`n thu´’ hai bo’’i câu leˆ
˙nhcat. Neˆ´u nhaˆ´n toˆ’ ho
˙’p phím <Ctrl>+<D>, mà dùng d¯eˆ’ ngu`’ng vieˆ
˙c nhaˆ
˙p du˜’ lieˆ
˙u, chúng ta se˜ qua la
˙i dòng nhaˆ ˙p leˆ
˙nh. Cu˜ng có theˆ’ su’’ du
˙ng toˆ’ ho
˙’p phím <Ctrl>+<C>, mà là câu leˆ˙nh trong heˆ
˙ vo’ d¯eˆ’ du`’ng chu’o’ng trình d¯ang cha ˙y. Neˆ´u d¯u’a tên moˆ
˙t taˆ
˙p tin vào làm tham soˆ´ cho leˆ
˙nhcat, thì noˆ
˙i dung cu’a leˆ
˙nh này se˜ d¯u’o ˙’c d¯u’a to´’i d¯aˆ`u vào tiêu chuaˆ’n, tu`’ d¯ó leˆ
˙nhcatse˜ d¯o ˙c noˆ
˙i dung này và d¯u’a to´’i d¯aˆ`u ra tiêu chuaˆ’n (xem so’ d¯oˆ`).
Noˆ
˙i dung taˆ˙p tin -> D¯ aˆ`u vào tiêu chuaˆ’n (stdin) --cat--> d¯aˆ`u ra tiêu chuaˆ’n (stdout)
D
¯ ây chı’ là moˆ
˙t tru’o`’ng ho
˙’p riêng cu’a vieˆ˙c chuyeˆ’n hu’o´’ng du˜’ lieˆ
˙u d¯aˆ`u vào, moˆ
˙t co’ cheˆ´ raˆ´t có ích cu’a heˆ
˙vo’. Và taˆ´t nhiên chúng ta caˆ`n xem xét ky˜ ho’n co’ cheˆ´ này.
3.5 Chuyeˆ’n hu’o´’ng d¯aˆ`u vào/d¯aˆ`u ra, d¯u’o`’ng oˆ´ ng và d¯aˆ`u lo ˙c
Ma˘
˙c dù, nhu’ d¯ã nói o’’ trên, thông thu’o`’ng d¯aˆ`u vào/d¯aˆ`u ra cu’a moˆ
˙t chu’o’ng trình liên keˆ´t vo´’i các d¯aˆ`u vào/d¯aˆ`u ra tiêu chuaˆ’n, trong heˆ
˙ vo’ còn có các môi tru’o`’ng d¯a˘ ˙c bieˆ
˙t cho phép chuyeˆ’n hu’o´’ng d¯aˆ`u vào/d¯aˆ`u ra.
3.5.1 Su’’ du
˙ng >, < và >>
D
¯ eˆ’ chuyeˆ’n hu’o´’ng d¯aˆ`u vào/ra, su’’ du
˙ng các ký hieˆ
˙u ">", "<" và ">>". Thu’o`’ng su’’ du ˙ng vieˆ
˙c chuyeˆ’n hu’o´’ng d¯u˜’ lieˆ
˙u ra cu’a câu leˆ
˙nh vào taˆ
˙p tin. Du’o´’i d¯ây là moˆ
˙t ví du˙ tu’o’ng u´’ng:
kênh giao tác
maikhai@fpt:/some/where$ ls -l > /home/maikhai/ls.txt
Theo leˆ
˙nh này danh sách taˆ
˙p tin và thu’ mu
˙c con cu’a thu’ mu
˙c, mà tu`’ d¯ó ngu’o`’i dùng thu ˙’c hieˆ˙n leˆ ˙nhls 2 se˜ d¯u’o
˙’c ghi vào taˆ˙p tin/home/maikhai/ls.txt; khi này neˆ´u taˆ ˙p tin
2thu’ mu ˙c hieˆ
ls.txt không toˆ`n ta
˙i, thì nó se˜ d¯u’o
˙’c ta˙o ra; neˆ´u taˆ
˙p tin d¯ã có, thì noˆ
˙i dung cu’a nó se˜ bi ˙ xóa và ghi d¯è bo’’i danh sách nói trên. Neˆ´u ba
˙n không muoˆ´ n xóa noˆ
˙i dung cu˜ mà ghi thêm du˜’ lieˆ
˙u d¯aˆ`u ra vào cuoˆ´ i taˆ
˙p tin, thì caˆ`n su’’ du
˙ng ký hieˆ
˙u >> thay cho >. Khi này khoa’ng tra˘´ng tru’o´’c và sau các ký hieˆ
˙u >hay>>không có ý nghı˜a và chı’ dùng vo´’i mu
˙c d¯ích thuaˆ ˙n tieˆ
˙n, deˆ˜ nhìn. Ba
˙n có theˆ’ chuyeˆ’n hu’o´’ng không chı’ vào taˆ
˙p tin, mà còn to´’i d¯aˆ`u vào cu’a moˆ ˙t câu leˆ
˙nh khác hay to´’i moˆ
˙t thieˆ´t bi
˙nào d¯ó (ví du
˙, máy in). Ví du˙, d¯eˆ’ d¯u’a noˆ
˙i dung taˆ ˙p tin
/home/maikhai/ls.txtvu`’a ta
˙o o’’ trên to´’i cu’’a soˆ’ terminal thu´’ hai3có theˆ’ su’’ du ˙ng leˆ
˙nh sau:
kênh giao tác
maikhai@fpt:/sw$ cat /home/maikhai/ls.txt > /dev/tty2
Nhu’ ba
˙n thaˆ´y,>dùng d¯eˆ’ chuyeˆ’n hu’o´’ng du˜’ lieˆ
˙u cu’a d¯aˆ`u ra. Chu´’c na˘ng tu’o’ng tu
˙’ d¯oˆ´ i vo´’i d¯aˆ`u vào d¯u’o
˙’c thu˙’c hieˆ˙n bo’’i<. Ví du
˙, có theˆ’ d¯eˆ´m soˆ´ tu`’ trong taˆ
˙p tinls.txtnhu’ sau (chú ý, d¯ây chı’ là moˆ
˙t ví du˙ minh ho˙a, trên thu˙’c teˆ´ thu’o`’ng su’’ du
˙ng câu leˆ
˙nh d¯o’n gia’n ho’n):
kênh giao tác
maikhai@fpt:/sw$ wc -w < /home/maikhai/ls.txt
Cách chuyeˆ’n hu’o´’ng này thu’o`’ng d¯u’o
˙’c su’’du˙ng trong các script, cho các câu leˆ
˙nh mà thu’o`’ng tieˆ´p nhaˆ
˙n (hay cho`’) du˜’ lieˆ
˙u vào tu`’ bàn phím. Trong script dùng d¯eˆ’ tu
˙’ d¯oˆ˙ng hóa moˆ
˙t thao tác nào d¯ó, có theˆ’ d¯u’a các thông tin caˆ`n thieˆ´t cho câu leˆ
˙nh tu`’ taˆ
˙p tin: trong taˆ
˙p tin này ghi sa˘˜n nhu˜’ng gì caˆ`n d¯eˆ’ thu
˙’c hieˆ˙n leˆ
˙nh d¯ó. Bo’’i vì các ký hieˆ
˙u<, >và>>làm vieˆ
˙c vo´’i các kênh tiêu chuaˆ’n (d¯aˆ`u vào hoa˘
˙c d¯aˆ`u ra), chúng không chı’ d¯u’o
˙’c dùng theo các cách quen thuoˆ˙c, thu’o`’ng dùng, mà còn có theˆ’ theo cách khác, "la
˙ma˘´t" ho’n. Ví du
˙, các câu leˆ
˙nh sau là tu’o’ng d¯u’o’ng:
kênh giao tác
[user]$ cat > file [user]$ cat>file [user]$ >file cat [user]$ > file cat
Tuy nhiên, tu
˙’ chúng (không có moˆ˙t leˆ
˙nh nào, tu´’c là không có kênh tiêu chuaˆ’n nào cho leˆ
˙nh) các ký tu˙’ chuyeˆ’n hu’o´’ng này không theˆ’ d¯u’o˙’c su’’ du˙ng, nhu’ theˆ´ không theˆ’, ví du ˙, nhaˆ
˙p vào dòng leˆ
˙nh sau:
kênh giao tác
[user]$ file1 > file2
mà thu d¯u’o
˙’c ba’n sao cu’a moˆ˙t taˆ
˙p tin nào d¯ó. Nhu’ng d¯ieˆ`u này không làm gia’m giá tri ˙cu’a
co’ cheˆ´ này, bo’’i vì các kênh tiêu chuaˆ’n có cho mo
˙i câu leˆ
˙nh. Khi này, có theˆ’ chuyeˆ’n hu’o´’ng không chı’ d¯aˆ`u vào và d¯aˆ`u ra tiêu chuaˆ’n, mà còn các kênh khác. D¯ eˆ’ làm d¯u’o
˙’c d¯ieˆ`u này, caˆ`n d¯a˘
˙t tru’o´’c ký hieˆ
˙u chuyeˆ’n hu’o´’ng soˆ´ cu’a kênh muoˆ´n chuyeˆ’n. D¯ aˆ`u vào tiêu chuaˆ’n stdin có soˆ´ 0, d¯aˆ`u ra tiêu chuaˆ’n stdout - soˆ´ 1, kênh thông báo loˆ˜i stderr - soˆ´ 2. Tu´’c là leˆ
˙nh chuyeˆ’n hu’o´’ng có da
˙ng d¯aˆ`y d¯u’ nhu’ sau (xin d¯u’o
˙’c nha˘´c la˙i, khoa’ng tra˘´ng ca˙nh > là không nhaˆ´t thieˆ´t):
command N > M
3ba
˙n caˆ`n dùng toˆ’ ho
3.5 Chuyeˆ’n hu’o´’ng d¯aˆ`u vào/d¯aˆ`u ra, d¯u’o`’ng oˆ´ ng và d¯aˆ`u lo
˙c 33
Trong d¯ó, N và M - soˆ´ cu’a kênh tiêu chuaˆ’n (0, 1, và 2) hoa˘
˙c tên taˆ
˙p tin. Trong moˆ ˙t vài tru’o`’ng ho
˙’p có su’’ du˙ng các ký hieˆ
˙u<, >và>>mà không chı’ ra soˆ´ kênh hay tên taˆ
˙p tin, vì vào choˆ˜ còn thieˆ´u se˜ d¯a˘
˙t, theo ma˘˙c d¯i
˙nh, 1 neˆ´u dùng>, tu´’c là d¯aˆ`u ra tiêu chuaˆ’n, hoa˘
˙c 0 neˆ´u dùng<, tu´’c là d¯aˆ`u vào tiêu chuaˆ’n. Nhu’ theˆ´, khi không có soˆ´ nào chı’ ra,>se˜ d¯u’o
˙’c biên di˙ch là1 >, còn<se˜ d¯u’o
˙’c biên di˙ch là0 <. Ngoài vieˆ
˙c chuyeˆ’n hu’o´’ng các kênh tiêu chuaˆ’n d¯o’n gia’n nhu’ vaˆ
˙y, còn có kha’ na˘ng không nhu˜’ng chuyeˆ’n hu’o´’ng du˜’ lieˆ
˙u vào kênh này hay kênh khác, mà còn sao chép noˆ
˙i dung cu’a các kênh tiêu chuaˆ’n d¯ó. Ký hieˆ
˙u & dùng d¯eˆ’ thu ˙’c hieˆ˙n d¯ieˆ`u này, khi d¯a˘
˙t nó (&) tru’o´’c soˆ´ cu’a kênh se˜ chuyeˆ’n du˜’ lieˆ ˙u d¯eˆ´n:
command N > &M
Leˆ
˙nh này có nghı˜a là, d¯aˆ`u ra cu’a kênh vo´’i soˆ´ N d¯u’o
˙’c gu’’i d¯eˆ´ n ca’ d¯aˆ`u ra tiêu chuaˆ’n, và sao chép to´’i kênh có soˆ´ M. Ví du
˙, d¯eˆ’ sao chép thông báo loˆ˜i vào d¯aˆ`u ra tiêu chuaˆ’n, caˆ`n dùng leˆ ˙nh 2>&1, còn 1>&2 sao chép stdout vào stderr. Kha’ na˘ng này d¯a˘
˙c bieˆ
˙t có ích khi muoˆ´ n ghi d¯aˆ`u ra vào taˆ
˙p tin, vì khi d¯ó chúng ta vu`’a có theˆ’ nhìn thaˆ´y thông báo trên màn hình, vu`’a ghi chúng vào taˆ
˙p tin. Ví du˙, tru’o`’ng ho
˙’p sau thu’o`’ng d¯u’o˙’c u´’ng du˙ng trong các script cha˙y khi kho’’i d¯oˆ ˙ng Linux:
kênh giao tác
teppi82@teppi:~$ cat hiho > /dev/null cat: hiho: No such file or directory
teppi82@teppi:~$ cat hiho > /dev/null 2>&1
3.5.2 Su’’ du ˙ng |
Moˆ
˙t tru’o`’ng ho
˙’p d¯a˘˙c bieˆ
˙t cu’a chuyeˆ’n hu’o´’ng d¯aˆ`u ra là su
˙’ toˆ’ chu´’c các d¯u’o`’ng oˆ´ ng (ha y còn có theˆ’ go
˙i là kênh giu˜’a các chu’o’ng trình, hoa˘
˙c ba˘ng chuyeˆ`n). Hai hay vài câu leˆ
˙nh, mà d¯aˆ`u ra cu’a leˆ
˙nh tru’o´’c dùng làm d¯aˆ`u vào cho leˆ
˙nh sau, liên keˆ´t vo´’i nhau (có theˆ’ nói phân cách nhau, neˆ´u muoˆ´ n) bo’’i ký hieˆ
˙u ga˙ch tha˘’ng d¯u´’ng - "|". Khi này d¯aˆ`u ra tiêu chuaˆ’n cu’a leˆ
˙nh d¯u´’ng bên trái so vo´’i|du’o
˙’c chuyeˆ’n d¯eˆ´ n d¯aˆ`u vào tiêu chuaˆ’n cu’a chu’o’ng trình, du´’ng bên pha’i so vo´’i|. Ví du
˙:
kênh giao tác
maikhai@fpt:/sw$ cat ls.txt | grep knoppix | wc -l
Dòng này có nghı˜a là keˆ´t qua’ cu’a leˆ
˙nhcat, tu´’c là noˆ
˙i dung taˆ
˙p tin ls.txt, se˜ d¯u’o
˙’c chuyeˆ’n d¯eˆ´n d¯aˆ`u vào cu’a leˆ
˙nhgrep, leˆ
˙nh này se˜ phân chia noˆ
˙i dung nói trên và chı’ laˆ´y ra nhu˜’ng dòng nào có chu´’a tu`’ knoppix. D¯ eˆ´ n lu’o
˙’t mình, keˆ´ t qu’a cu’a leˆ
˙nhgrep d¯u’o
˙’c chuyeˆ’n to´’i d¯aˆ`u vào cu’a leˆ
˙nhwc -l, mà tính soˆ´ nhu˜’ng dòng thu d¯u’o
˙’c. D¯ u’o`’ng oˆ´ ng su’’ du
˙ng d¯eˆ’ keˆ´t ho ˙’p vài chu’o’ng trình nho’ la
˙i vo´’i nhau (moˆ˜i chu’o’ng trình thu
˙’c hieˆ˙n moˆ
˙t bieˆ´n d¯oˆ’i xác d¯i
˙nh nào d¯ó trên d¯aˆ`u vào) ta
˙o thành moˆ ˙t leˆ
˙nh toˆ’ng quát, mà keˆ´t qua’ cu’a nó se˜ là moˆ
˙t bieˆ´n d¯oˆ’i phu´’c ta ˙p. Caˆ`n chú ý ra˘`ng, heˆ
˙ vo’ go˙i và thu˙’c hieˆ˙n taˆ´t ca’ các câu leˆ
˙nh có trong d¯u’o`’ng oˆ´ng cùng moˆ
˙t lúc, cha˙y moˆ˜i leˆ
˙nh d¯ó trong moˆ
˙t ba’n sao heˆ
˙vo’ riêng. Vì theˆ´ ngay khi chu’o’ng trình thu´’nhaˆ´t ba˘´t d¯aˆ`u d¯u’a keˆ´t qua’ o’’ d¯aˆ`u ra, chu’o’ng trình tieˆ´p theo ba˘´t d¯aˆ`u xu’’ lý keˆ´t qua’ này. Cu˜ng y nhu’ vaˆ
˙y, các leˆ ˙nh tieˆ´p theo thu
˙’c hieˆ˙n các công vieˆ
˙c cu’a mình: cho`’ du˜’ lieˆ ˙u tu`’ leˆ
˙nh tru’o´’c và d¯u’a keˆ´t qua’ cho leˆ ˙nh tieˆ´p theo, gioˆ´ ng nhu’moˆ
˙t dây chuyeˆ`n sa’n xuaˆ´t. Neˆ´u nhu’muoˆ´n moˆ ˙t leˆ
˙nh nào d¯ó keˆ´t thúc hoàn
toàn, tru’o´’c khi thu
˙’c hieˆ˙n leˆ ˙nh tieˆ´p theo, ba ˙n có theˆ’ su’e’ du ˙ng trên moˆ ˙t dòng ca’ ký hieˆ ˙u dây chuyeˆ`n|, cu˜ng nhu’ daˆ´u chaˆ´p phaˆ’y;. Tru’o´’c moˆ˜i daˆ´u chaˆ´m phaˆ’y, heˆ
˙ vo’ se˜ du`’ng la
˙i và cho`’ cho d¯eˆ´n khi thu
˙’c hieˆ˙n xong taˆ´t ca’ các câu leˆ
˙nh tru’o´’c cu’a d¯u’o`’ng oˆ´ng. Tra
tri
˙lôgíc, mà d¯u’o
˙’c tra’ la˙i sau khi thu˙’c hieˆ˙n xong chu’o’ng trình) cu’a moˆ
˙t d¯u’o`’ng oˆ´ng se˜ trùng