《LINUX入門:Linux Shell腳本中read、重定向和文件句柄和進程數目控制》要點:
本文介紹了LINUX入門:Linux Shell腳本中read、重定向和文件句柄和進程數目控制,希望對您有用。如果有疑問,可以聯系我們。
Linux Shell腳本中read、重定向和文件句柄和進程數目控制
1、把重定向作為read的輸入
read可以從尺度輸入讀取一行,下面就使用read配合重定向把文件作為read的標注輸入.
#!/bin/bash
#name:? ? ?links.sh
#?Revision:? ? 1.1
#?Date:? ? ? ? 2017//
#?Author:? ? ? linuxidc
#?Email:? ? ? ?memeda@163.com
#?Website:? ? ?
#?Description:?Print?the?ip-links
#?Notes:? ? ? ?
#?-------------------------------------------------------------------------------
#?Copyright:? ?2017?(c)?linuxidc
#?License:? ? ?GPL
#
?
?while
?read
?line?;
do
? ?
echo
?"line=$line"
? ?
sleep
?2
done
?<
/home/linuxidc/model
.txt? ? ? ?
#把文件作為read的的輸入
?
?unset
?line
接下來運行一下
root@linuxidc:
/home/yemo
#?bash? file_des.sh?
line=
#!/bin/bash
line=
#name:? ? ?links.sh
line=
#?Revision:? ? 1.1
line=
#?Date:? ? ? ? 2017/6/
line=
#?Author:? ? ? linuxidc
line=
#?Email:? ? ? ?memeda@163.com
line=
#?Website:
line=
#?Description:?Print?the?ip-links
line=
#?Notes:
line=
#?-------------------------------------------------------------------------------
輸出了我的bash頭部模板文件的內容
?2、再話文件描述符
?文件在打開時候系統給每一個打開的文件分配用于維護的描述符,這通常包含系統打開文件描述符表,進程級的文件描述符表(文件操作符標志和文件句柄的引用),文件系統i-node表.
? ? 基本用法
exec
?fd<>
file
? ? ? ? ? ? ? ? ?#創立一個文件句柄? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
exec
?fd>&-? ?or? ?
exec
?-fd<&? ? ?
#關閉文件句柄
?創立文件描述符后在/proc/PID/fd中新建,通過$$查看當前shell的PID.
root@linuxidc:
/home/yemo
#?cd?/proc/$$/fd? ? ? ? ? ? ? ? ? ? ?
root@linuxidc:
/proc/6833/fd
#?ls
0? 1? 2? 255
?給文件/home/linuxidc/model.txt創立一個描述符fd6
root@linuxidc:
/proc/6833/fd
#?exec?6<>/home/linuxidc/model.txt
root@linuxidc:
/proc/6833/fd
#?ls
0? 1? 2? 255? 6
打開fd6,查看內容
root@linuxidc:
/proc/6833/fd
#?cat?6
#!/bin/bash
#name:? ? ?links.sh
#?Revision:? ? 1.1
#后面挺長就省略了,這不是重點
我們可以通過fd6,讀寫文件model.txt
root@linuxidc:
/proc/6833/fd
#?echo?"hello?girl"?>>6
root@linuxidc:
/proc/6833/fd
#?tail?-1?6
hello?girl
如果刪除文件,fd6會怎么樣呢
root@linuxidc:
/proc/6833/fd
#?stat?-c?%i?/home/linuxidc/model.txt? ?#先查看下inode
128531
root@linuxidc:
/proc/6833/fd
#?stat?-c?%i?6
49938
root@linuxidc:
/proc/6833/fd
#?rm?/home/linuxidc/model.txt?
root@linuxidc:
/proc/6833/fd
#?ls
0? 1? 2? 255? 6
fd6顯示成紅色,表現文件已經不存在了,我們打開一下
root@linuxidc:
/proc/6833/fd
#?cat?6
#!/bin/bash
#name:? ? ?links.sh
#?Revision:? ? 1.1
#此處省略很多行
hello?girl
依舊可以打開,文件的刪除只是刪除的上級目錄的存在的一個文件名,當文件在使用時候,并不會釋放inode,只要block的數據沒被覆蓋都可以找回來,這里文件不大直接打開fd6重定向回去就好.
3、通過fd把文件內容傳給read
root@linuxidc:
/proc/6833/fd
#?exec?6>&-? ? ? ? ? ? #關閉文件句柄
root@linuxidc:
/proc/6833/fd
#?ls
0? 1? 2? 255
新建腳本測試一下
使用-u選項:?
-u fdread from file descriptor FD instead of the standard input
#!/bin/bash
#filename:? ? ?file_des.sh
#?Revision:? ? 1.1
#?Date:? ? ? ? 2017-06-09
#?Author:? ? ? linuxidc
#?Email:? ? ? ?memeda@163.com
#?QQ:? ? ? 787743742
#?Website:? ? ?
#?Description:?
#?Notes:? ? ? ?
#?-------------------------------------------------------------------------------
#?Copyright:? ?2017?(c)?linuxidc
#?License:? ? ?GPL
?
?exec
?6<>
/home/linuxidc/model
.txt? ? ? ? ? ? ? ? ? ? ? ?
#創建文件句柄(fd6)
?
?while
?read
?-u?6?line?;
do
? ? ? ? ? ? ? ? ? ?#循環讀取文件
? ?
echo
?"line=$line"
? ?
sleep
?2
done
?exec
?6>&-? ? ? ? ? ? ? ? ? ? ? ? ?
#文件用完,關閉文件句柄
unset
?line? ? ? ? ? ? ? ? ? ? ? ? ?
#自定義變量,結束釋放
執行成果:
root@linuxidc:
/home/yemo
#?bash?file_des.sh?
line=
#!/bin/bash
line=
#name:? ? ?links.sh
line=
#?Revision:? ? 1.1
line=
#?Date:? ? ? ? 2017/6/
line=
#?Author:? ? ? linuxidc
line=
#?Email:? ? ? ?memeda@163.com? ? ? ? ? ? #后面的內容就省略了
?表面上看來這么做和單獨使用重定向效果一樣,但是當程序必要多個輸入時候,單獨的重定向只能讓read讀取單獨一個文件內容無法為每個單獨指定輸入.
4、通過文件句柄創立多進程
?read -u 讀取文件描述符的方式讀取字符串
?設置文件描述符中回車數量為預設進程數目
?通過循環建立多進程
#!/bin/bash
#filename:? ? ?mproc.sh
#?Revision:? ? 1.1
#?Date:? ? ? ? 2017-06-09
#?Author:? ? ? linuxidc
#?Email:? ? ? ?memeda@163.com
#?QQ:? ? ? 787743742
#?Website:? ? ?
#?Description:?This?is?use?for?test?shell?multiprocess
#?Notes:? ? ? ?
#?-------------------------------------------------------------------------------
#?Copyright:? ?2017?(c)?linuxidc
#?License:? ? ?GPL
#
#?This?program?is?free?software;?you?can?redistribute?it?and/or
#?modify?it?under?the?terms?of?the?GNU?General?Public?License
#?as?published?by?the?Free?Software?Foundation;?either?version?2
#?of?the?License,?or?(at?your?option)?any?later?version.
#?This?program?is?distributed?in?the?hope?that?it?will?be?useful,
#?but?WITHOUT?ANY?WARRANTY;?without?even?the?implied?warranty
#?of?MERCHANTABILITY?or?FITNESS?FOR?A?PARTICULAR?PURPOSE.?See?the
#?GNU?General?Public?License?for?more?details.
#
#?you?should?have?received?a?copy?of?the?GNU?General?Public?License
#
#?If?any?changes?are?made?to?this?script,?please?mail?me?a?copy?of?the?changes
#?-------------------------------------------------------------------------------
#Version?1.0
#
?
?main_sub()?{
? ?
local
?loop_time=$((?$1?%?7?))
? ?
echo
?-e?
"$i\t----\t---$loop_time?begin"
? ?
sleep
?$loop_time
? ?
echo
?-e?
"$i\t-----\t$loop_time?end"
}
tmp_file=
"/tmp/.fifo-$$"
mkfifo
?$tmp_file? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#創立fifo文件用于進程通信? ?
exec
?6<>$tmp_file? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#創立文件句柄6為管道
rm
?-f?$tmp_file
?
??
?my_thread=6? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#限制進程數
runtime=50
?
?for
?((?i=0?;?i?<?$my_thread?;?i++?))?;?
do
? ?
echo
done
?>&6? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#循環寫入回車符到管道
?
?for
?((?i=0?;?i?<?$my_thread?;?i++?))?;?
do
? ? ?
read
?-u?6? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#進程數量控制
? ? ? ?
{
? ? ? ? ? ?
main_sub?$i
? ? ? ? ? ?
echo
?>&6? ? ?
#每次函數執行完寫入一個回車符,保證進程數目是指定的
? ? ? ?
}&? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#后臺運行
done
wait? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#父進程等待子進程結束后再退出
?
?exec
?6<&-
exit
?0
本文永久更新鏈接地址:
維易PHP培訓學院每天發布《LINUX入門:Linux Shell腳本中read、重定向和文件句柄和進程數目控制》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。