鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)四十三天---臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)四十五天---xargs
shell學(xué)習(xí)第三天
shell 學(xué)習(xí)十五天---join 連接字段
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)四十三天---臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)第六天---小結(jié)
shell 學(xué)習(xí)三十三天---關(guān)于重定向
shell 學(xué)習(xí)二十九天---循環(huán)
shell 學(xué)習(xí)二十四天---提取開頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第十天---sed 查找與替換
shell 學(xué)習(xí)第十一天---sed 正則的精確控制
shell 學(xué)習(xí)三十天---break,continue,shift,getopts
shell 學(xué)習(xí)---小結(jié)
shell 學(xué)習(xí)三十一天---函數(shù)問題
shell 學(xué)習(xí)第四天---華麗的 printf 輸出
shell 學(xué)習(xí)三十五天---波浪號展開與通配符
shell 學(xué)習(xí)十九天---文本塊排序
shell 學(xué)習(xí)十二天---行與字符串
shell 學(xué)習(xí)二十一天---重新格式化段落
shell 學(xué)習(xí)十八天---文本排序
shell 學(xué)習(xí)十三天---sed 案例分析
shell 學(xué)習(xí)四十一天---列出文件 ls 和 od 命令
shell 學(xué)習(xí)十七天---awk 命令
shell 學(xué)習(xí)三十六天---命令替換
shell 學(xué)習(xí)十六天---join 練習(xí)
shell 學(xué)習(xí)三十二天---read 讀取一行
shell 學(xué)習(xí)二十二天---計(jì)算行數(shù),字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)小總結(jié)---本章小結(jié)
shell 學(xué)習(xí)第八天---擴(kuò)展正則表達(dá)式(ERE)
shell 學(xué)習(xí)四十二天---使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)二十八天---case 語句
shell 學(xué)習(xí)三十九天---內(nèi)建命令
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)三十四天---printf 詳解
shell 學(xué)習(xí)二十六天---變量與算數(shù)
shell 學(xué)習(xí)三十八天---執(zhí)行順序和 eval
shell 學(xué)習(xí)四十四天---尋找文件
shell 學(xué)習(xí)二十五天---神器的管道符
shell 學(xué)習(xí)十四天---使用 cut 選定字段
shell 學(xué)習(xí)第五天---基本的I/O重定向
shell 學(xué)習(xí)四十天---awk 的驚人表現(xiàn)
shell 學(xué)習(xí)二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)二十三天---打印
shell 學(xué)習(xí)第九天---分組
shell 學(xué)習(xí)四十八天---文件校驗(yàn)和匹配
shell 學(xué)習(xí)二十七天---退出狀態(tài)和 if 語句
shell 學(xué)習(xí)四十七天---文件比較 cmp,diff,patch
shell 學(xué)習(xí)第七天---基礎(chǔ)正則表達(dá)式(BRE)
shell 學(xué)習(xí)四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)三十七天---引用
shell 學(xué)習(xí)小結(jié)

shell 學(xué)習(xí)四十三天---臨時(shí)性文件的建立與使用

雖然使用管道可以省去建立臨時(shí)性文件的需求,不過有時(shí)臨時(shí)性文件還是派得上用場的.linux 不同于其他的操作系統(tǒng)的地方就是:他沒有那種將不再需要的文件設(shè)法刪除的做法.反倒是提供了兩個(gè)特殊目錄:/tmp 與/var/tmp(舊系統(tǒng)是/usr/tmp),這些文件可入場被存儲(chǔ),當(dāng)他們未被清理干凈時(shí)也不會(huì)弄亂一般的目錄.大部分系統(tǒng)上的/tmp 都會(huì)在系統(tǒng)開機(jī)時(shí)清理,不過/var/tmp 下的在重啟時(shí)仍需存在,因?yàn)橛行┪淖志庉嫵绦?會(huì)將他們的備份文件放在這里,從而系統(tǒng)損毀后可以用來恢復(fù)數(shù)據(jù).

因?yàn)?tmp 使用頻繁,有些系統(tǒng)就會(huì)將他們放在常駐內(nèi)存型的文件系統(tǒng)里,以便快速訪問
$df /tmp
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 1032088 262608 717052 27% /

將文件系統(tǒng)放在替換空間(swap)區(qū)域里,表示它存在與內(nèi)存中,直到內(nèi)存資源被使用得剩很少時(shí),部分信息才會(huì)寫入替換空間.

為確保臨時(shí)性文件會(huì)在任務(wù)完成時(shí)刪除,編譯語言的程序員可以先開啟文件,再下達(dá) unlink()系統(tǒng)調(diào)用.

$$變量
使用$$變量可以獲取 shell 本身的 PID.
案例:
$echo $$
1736

使用$$變量構(gòu)建臨時(shí)性文件名的一部分.要解決完整臨時(shí)性文件名發(fā)生此問題的可能性,可使用環(huán)境變量覆蓋目錄名稱,通常是 TMPDIR.另外,應(yīng)該使用 trap 命令,要求在工作完成時(shí)刪除臨時(shí)性文件.因此,常見的 shell 腳本起始如下:

umask 077                   #刪除用戶以外其他人的所有訪問權(quán)  
TMPFILE=$(TMPDIR-/tmp)/myprog.$$    #產(chǎn)生臨時(shí)文件  
trap ‘rm -f $TMPFILE’ EXIT #完成刪除臨時(shí)性文件  

mktemp 程序

因?yàn)槭褂?tmp/myprog.$$這樣的文件名太好猜了,所以就有了 mktemp 命令.
在進(jìn)行 shell 腳本程序設(shè)計(jì)時(shí),經(jīng)常需要生成臨時(shí)文件,使用 mktemp 命令即可滿足這樣的要求,且保證了文件的安全性.
語法:
mktemp [-qu] [文件名參數(shù)]
有的系統(tǒng)是沒有 mktemp 命令的,這時(shí)我們需要給 mktemp 打補(bǔ)丁,以使它包含 tempfile 包:
patch -Np1 -i ../mktemp-1.5-add_tempfile-2.patch
編譯 mktemp:
./configure --prefix=/usr --with-libc
配置選項(xiàng)的含義:
--with-libc
這個(gè)使得 mktemp 程序從系統(tǒng)的 C 庫中使用 mkstep 和 mkdtemp 的功能.
編譯軟件包:
make
安裝軟件包:
make install
make install-tempfile

主要參數(shù)

參數(shù) 作用
-q 執(zhí)行時(shí)若發(fā)生錯(cuò)誤,不會(huì)顯示任何信息
-u 暫存文件會(huì)在mktemp結(jié)束前先行刪除
-V 顯示版本信息

案例:

$mktemp tmp.XXX  
tmp.DSH  
$ mktemp tmp.XXX  
tmp.hEc  
$ mktemp tmp.XXX  
tmp.7yi  

分析:點(diǎn)號后面的三個(gè)大寫字母XXX代表了三個(gè)隨機(jī)數(shù).
$ ll
-rw------- 1 root root 0 7月 12 18:43 tmp.7yi
-rw------- 1 root root 0 7月 12 18:43 tmp.DSH
-rw------- 1 root root 0 7月 12 18:43 tmp.hEc

/dev/random 與/dev/urandom 特殊文件
這兩個(gè)文件都是用來產(chǎn)生隨機(jī)數(shù)的.他們產(chǎn)生隨機(jī)數(shù)的原理是利用當(dāng)前系統(tǒng)的熵池來計(jì)算出一定數(shù)量的隨機(jī)比特,然后將這些比特作為字節(jié)流返回.熵池就是當(dāng)前系統(tǒng)的環(huán)境噪音,熵指的是一個(gè)系統(tǒng)的混亂程度,系統(tǒng)噪音可以通過很多參數(shù)來評估,如內(nèi)存的使用,文件的使用,文件的使用量,不同類型的進(jìn)程數(shù)量等等.如果當(dāng)前環(huán)境噪音變得不是很劇烈或者當(dāng)前環(huán)境噪音很少,日過剛開機(jī)的時(shí)候,而當(dāng)前需要大量的隨機(jī)比特,這時(shí)產(chǎn)生的隨機(jī)數(shù)的隨機(jī)數(shù)效果就不是很好了.

這就是為什么會(huì)有/dev/urandom 和/dev/random 這兩種不同的文件,后者在不能產(chǎn)生新的隨機(jī)數(shù)時(shí)會(huì)阻塞程序,而前者不會(huì)(ublock),當(dāng)然產(chǎn)生的隨機(jī)數(shù)效果就不太好了,這對加密解密這樣的應(yīng)用來說不是一種很好的選擇./dev/random 會(huì)阻塞當(dāng)前的程序,知道根據(jù)熵池產(chǎn)生新的隨機(jī)字節(jié)之后才返回,所以使用/dev/random 比使用/dev/urandom 產(chǎn)生大量隨機(jī)數(shù)的速度要慢.案例:
$dd if=/dev/random of=random.dat bs=1024b count=1
記錄了 0+1 的讀入
記錄了 0+1 的寫出
128 字節(jié)(128 B)已復(fù)制,0.000356299 秒,359 kB/秒
$ dd if=/dev/urandom of=random.dat bs=1024b count=1
記錄了 1+0 的讀入
記錄了 1+0 的寫出
524288 字節(jié)(524 kB)已復(fù)制,0.226209 秒,2.3 MB/秒