close
一、用戶登陸進入系統後的系統環境變量:
$HOME 使用者自己的目錄
$PATH 執行命令時所搜尋的目錄
$TZ 時區
$MAILCHECK 每隔多少秒檢查是否有新的信件
$PS1 在命令列時的提示號
$PS2 當命令尚未打完時,Shell 要求再輸入時的提示號
$MANPATH man 指令的搜尋路徑
二、特殊變量:
$0 這個程序的執行名字
$n 這個程序的第n個參數值,n=1..9
$*($@) 這個程序的所有參數
$# 這個程序的參數個數
$$ 這個程序的PID
$! 執行上一個指令的PID
$? 執行上一個指令的返回值
while getopts D:h options
do
case $options in
D) curdate=$OPTARG;;
h) echo 'USAG: CMD parameter'
exit 0;;
esac
done $OPTARG :代表的參數
$OPTIND: 命令+參數個數 shift n 向前移動n各參數;n+1: $1, n+2: $2 ...$#=$#-n
三、shell中的變元:
* 任意字符串
? 一個任意字符
[abc] a, b, c三者中之一
[a-n] 從a到n的任一字符
四、幾個特殊字符表示
\b 退回
\c 打印一行時沒有換行符 這個我們經常會用到
\f 換頁
\r 回車
\t 制表
\v 垂直制表
\\ 反斜線本身
五、判斷文件的屬性
格式:-操作符 filename
-e 文件存在返回1, 否則返回0
-r 文件可讀返回1,否則返回0
-w 文件可寫返回1,否則返回0
-x 文件可執行返回1,否則返回0
-o 文件屬於用戶本人返回1, 否則返回0
-z 文件長度為0返回1, 否則返回0.
-f 文件為普通文件返回1, 否則返回0
-d 文件為目錄文件時返回1, 否則返回0
六、測試字符串
字符串1 = 字符串2 當兩個字串相等時為真
字符串1 != 字符串2 當兩個字串不等時為真
-n 字符串 當字符串的長度大於0時為真
-z 字符串 當字符串的長度為0時為真
字符串 當串字符串為非空時為真
七、測試兩個整數關系
數字1 -eq 數字2 兩數相等為真
數字1 -ne 數字2 兩數不等為真
數字1 -gt 數字2 數字1大於數字2為真
數字1 -ge 數字2 數字1大於等於數字2為真
數字1 -lt 數字2 數字1小於數字2為真
數字1 -le 數字2 數字1小於等於數字2為真
八、邏輯測試
-a 與
-o 或
! 非
九,內部變量
$# 參數個數 ,從0開始計數
$* shell的所有參數
$@ 類似$*,具體請參看文章http://bbs.chinaunix.net/viewthread.php?tid=218853...
$- shell用的選擇項
$? 上次執行的命令的返回值
$$ shell的進程標識符
$! 用&啟動的最後一個命令的進程標識符
$HOME cd命令的缺省參數
$IFS 參數分隔詞的字符表
$MAIL 信件文件,當其改變時給出信息you have mail ... 沒用過這個^_^
$PATH 搜索命令的目錄表
$PS1 提示符串,缺省為$
$PS2 後繼命令行提示符串 ,缺省為>
今天介紹shell元字符的引用
===============================
> prog > file 將標準輸出重定向到文件
>> prog >> file 將標準輸出附加到文件
< prog < file 從文件file中獲取標準輸入
| p1 | p2 將p1的標準輸出作為p2的標準輸入
<* 匹配文件名中的零個或多個字符
? 匹配文件名中的任何單個字符
[abc] 匹配文件名中abc範圍內的任何字符,如0-9或a-z都是合法的
; 命令結束符,例如p1; p2表示先執行p1,再運行p2
& 命令結束符,與 ; 類似,但不等p1結束
`...` 運行...中的命令,輸出的結果代替`...`
(...) 在子shell中執行...中的命令
{...} 在當前shell中執行...中的命令(很少使用)
$1,$2等 $0...$9 代表shell文件的參數
$變量 shell變量的值
${變量} 變量的值,為避免在文本連接時混淆
\ \c 將 c 字符作為字符,但 \ 後面加換行符無效
'...' 作為文本,不作任何替換
"..." 在 ... 中的$、`...` 和 \ 得到替換後,將 ... 作為文本
# 表示註釋
變量=值 為變量賦值
p1&&p2 運行p1;若成功,再運行p2
p1||p2 運行p1;若不成功,再運行p2
下面我一一舉列說明
一、$符號
1、echo $? 顯示的是上一條指令退出狀態
2、echo "$?" 效果同上
3、echo '$?' 顯示的是$?
4、echo \$? 顯示的是$?
5、echo "\$?" 顯示的是$?
大家可能已經看出 $符號在雙引號中具有特殊意義 雙引號對$符號不起作用
而單引號可以將特殊字符的的特殊意義屏蔽掉,使其能顯示為字符本身,反斜
杠也可以將特殊字符的特殊含義屏蔽掉,使特殊字符失去特殊含義。
二、\ 反斜杠
反斜杠的作用是將特殊符號字符的特殊含義屏蔽掉,使其還是原字符
A=1234
echo \$A 顯示為$A 如果不加\將顯示為1234
echo \` 顯示為`
echo \" 顯示為雙引號
echo \\ 顯示為\
三、` 反引號
反引號的功能是命令替換,將反引號中的字符串做為命令來執行,我們在用shell編程時經常用的到 將系統命令的執行結果賦給一個變量
A=`date`
echo $A 顯示的不是date而是當時的時間串
比如有一文件A的內容如下
ABCDEFG
1234456
abcdefg
B=`cat A|grep 234` # 檢索文件A中含有字符串234的行
echo $B 將顯示為1234456
echo "$B" 將顯示為什麽?
echo "\$B" 將顯示為什麽?讀者自己試試
四、" 雙引號
在系統中有些特殊字符,為避免引用這些特殊字符 往往用雙引號或單引號將這些特殊字符引起來,使其不具有特殊含義。
但有一部分特殊字符在引號中還是具有特殊含義,用雙引號引起來是不起作用的。本文中所列的前四個特殊字符在雙引號中還是特殊字符。為了使其不具有特殊含義一是用單引號引進來二是用\反斜線使其失去作用。
比如我們想原樣輸出這些特殊字符
echo """
echo "$"
echo "\"
echo "`"
以上不是你所期望的結果,因為雙引號對它們不起作用,你只能這樣才能輸出這些特殊字符的原形
echo '"'
echo '$'
echo '\'
echo '`'
或
echo "\""
echo "\$"
echo "\\"
echo "\`"
將分別顯示為 " $ \ `
五、其它特殊字符
大家註意到 除了前四個特殊字符外 我將其它的特殊字符都放在一塊,這是因為前四個特殊字符在雙引號中還是具有特殊含義,所以單獨拿出來講,除此以外的特殊字符如果你要輸出這些特殊字符的原形,你就可以用雙引號或單引號引起來使其失去特殊含義。
< ,>,*,?,[,]對shell有特殊含義 但你可以用雙引號引起來輸入這些原形
講了這麽多大家是不是已經註意到所有的特殊字符在單引號中失去特殊含義,如果你要輸出特殊字符原形但又記不清那些特殊字符在雙引號中不能輸出原形,建議你幹脆用單引號引起來。
今天介紹條件測試語句
一、if 條件語句
格式:
if 條件表達式
then #當條件為真時執行以下語句
命令列表
else #為假時執行以下語句
命令列表
fi
if 語句也可以嵌套使用
if 條件表達式1
then
if 條件表達式2
then
命令列表
else
if 條件表達式3
then
命令列表
else
命令列表
fi
fi
else
命令列表
fi
你可以進行多層嵌套 一個if語句一定要跟一個fi 表示該層條件結束 否則會造成語法錯誤
結合前面講的 舉例如下:
這裏先講一個條件語句中用到的命令test 表示測試test後面的條件是否為真
if test -f "$1"
then
lpr $1
else
if test -d "$1"
then
cd $1
lpr $1
else
echo "$1不是文件或目錄"
fi
fi
以上的例子還可以改成如下所示
if test -f "$1"
then
lpr $1
elif test -d "$1" #elif 同else if
then
(cd $1;lpr $1)
else
echo "$1不是文件或目錄"
fi
以上的例子不知您是否看懂是什麽意思嗎?
假如我們現在將這個例子保存為prfile
chmod +x prfile
執行剛才的程序
./prfile aaa
這個例子是檢查你的輸入的參數是否是一個文件 如果是就打印 如果是一個目錄 先轉目錄再打印 如果即不是文件也不是目錄給出提示
二、多重條件測試語句case
格式:
case 字串 in
模式) 命令列表;;
模式) 命令列表;;
....
esac
多重條件語句是以case 開始以esac結束 中間可以有多個條件列表 功能是測試字串和和裏面的模式有沒有匹配的,有就執行裏面的命令列表 模式也可以是*號 表示任意字串,每個模式裏面的最後要心;;雙引號結束,否則會發生語法錯誤。
現舉例如下:
case $1 in
*.c)
cc $1
;;
*.txt)
lpr $1
;;
*)
echo "未知的類型"
esac
假如將以上內容保存在文件abc中
chmod +x abc
執行 ./abc a.c 將會對文件a.c進行編譯
執行 ./abc readme.txt 將會把文件通過打印機
假如我將以上內容改一下,你是否會知道它的執行結果?
case $1 in
*)
cc $1
;;
*.txt)
lpr $1
;;
*.c)
echo "未知的類型"
esac
今天介紹循環語句
一. while 循環
while 命令格式
while 條件表
do
命令表
done
執行過程
shell首先執行條件表,如果條件表的最後一條語句的退出狀態為零,則執行盾環體內的命令
表,執行完後,再檢查條件表,如果退出狀態為零將繼續執行,如此循環往復直到條件表的
最後一條語句的退出狀態非零. 退出狀態為零就是條件為真True.
舉例說明 假如shell文件的內容如下:
Sum=0
i=0
while true #true是系統的關鍵詞 表示真
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
if [ $i = "100" ]
then
break;
fi
done
echo $i $Sum
最後這個程序顯示的是 100 5050
這個程序的運算就是將1到100加起來
下面將這個程序再改動一下
Sum=0
i=0
while [ $i != "100" ]
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
done
echo $i $Sum
改動後的程序運算結果和上面是一樣 但程序比上面的要簡練
在這個循環中還可以以until做為測試條件它正好與while測試的條件相反,也就是當條件為假時將繼續執行循環體內的語句,否則就退出循環體,下面還用這個例子.
Sum=0
i=0
until [ $i = "100" ]
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
done
echo $i $Sum
當i不等於100時循環就是當條件為假時循環,否則就退出,而第一個例子是當i不等於100
時循環,也就是測試條件為真時循環.
二.for 循環
命令格式:
for 變量 in 名字列表
do
命令列表
done
這裏的名字列表是一個由空格分隔的字符串列表,shell在執行for循環時每次依次從名字表
中取出一個字符串賦給循環變量作為變量的值.
在寫for語句時,也可以省略in 名字列表部分,這表示用當前的位置參數來代替這時的名
字列表.
下面舉個例子
比如在你的電腦中有兩個目錄,一個是aa,一個是bb在這兩個目錄中有5個相同的文件,但其
中一個目錄中的一個或多個文件剛剛修改過,現在我忘記剛才改的是那幾個文件了,那麽我靠梢員冉弦幌掄飭礁瞿柯嫉奈募就知道?程序如下:
for File in a1 a2 a3 a4 a5
do
diff aa/$File bb/$File
done
下面再舉一個不帶名字列表的例子
for File
do
echo $Filw
done
文件內容保存在a.sh中 並可執行
我們在執行這個shell程序時命令行如下:
a.sh a1 a2 a3 a4 a5
執行結果如下:
a1
a2
a3
a4
a5
大家從這個例子中可以看到命令行的參數被逐一讀入一次
三.循環控制語句
break 命令不執行當前循環體內break下面的語句從當前循環退出.
continue 命令是程序在本循體內忽略下面的語句,從循環頭開始執行.
一,命令組合:圓括號和花括號
shell中有兩種方法將命令組合在一起:圓括號和花括號.圓括號使shell創建一個子shell
來讀取並執行括起來的名命令.左括號和右括號不論出現在命令行中的什麽位置,shell都會
認為它們具有特殊的組合意義的.只有用雙引號將它們括起來引用,才表示圓括號或花括號
的原義.例如:
echo a(b)
將出現語法上的錯誤,要想輸出a(b)字符串 只能括起來
echo "a(b)"
或echo a"("b")"
這樣才能被shell正確解釋.
利用組合命令有什麽作用呢?
一,用圓括號組合命令
圓括號的組合命令可以創建子進程運行組合程序,建立子進程的功能是很有用的,因為
子shell在組合命令中的種種操作都不會影響到當前shell的各變量的值.
例如:
子進程在執行組合命令時改變了工作目錄,並在新的工作目錄下執行一系例命令,執行
完後它可以不必返回原工作目錄,因為子進程工作目錄的改變不會影響到當前工作目錄.
創建子進程後將當前的環境也同樣傳給子shell,當前shell中用export輸出到環境中的
各變量在子shell中同樣有效.
花括號也可以將命令組合在一起.左右花括號只有作為一條命令的第一個字出現時,
shell才它們含有特殊含義.
與圓括號不同的是花括號並不創建子shell,只是由當前的shell來讀取並執行括起來的
命令.有時用戶希望使用一組命令的順序輸出作為另一組命令的輸入,此時用花括號是很方
便的.
不論是用圓括號不是花括號,退出狀態都是等於最後一條括起來的命令的退出狀態.
二,可以在當前shell中執行的命令
用戶在使用shell時一定要了解那些是可以在當前shell中執行的命令那些不可以
可以在當前shell中執行的命令有:
break case cd continue
echo eval exec exit
export for if read
readonly return set shift
test times trap umask
until wait while
: {}
=============================================================
.chmod
chmod [who] operator [permission] filename
who
u 所有者
g 組
o 其他用戶
a 所有用戶
operator
+ 增加權限
- 取消權限
= 設定權限
permission
r 讀權限
w 寫權限
x 執行權限
s 文件屬主和組set-ID
l 給文件加鎖,使其他用戶無法訪問
t 粘性位 (如果一個目錄上出現粘著位,這就意味著目錄中的文件只有其屬主才可以刪除,即使某個同組用戶具有和屬主同等的權限。不過有的系統上,這個規則並不嚴格;如果在文件列表時看到t,則意味著腳本或程序在執行時會被放在交換區(虛存),不過由於當今的內存價格如此這低,大可不必理會文件的t應用)
示例:
chmod a+x file
chmod og-w file
chmod g+w file
chmod u+x file
chmod go+x file
.suid/guid
chmod u+s file
# ls -l a.html
-rw-r--r-- a.html
# chmod u+s a.html
# ls -l a.html
-rwSr--r-- a.html
.find
find path -options [-print -exec -ok]
-exec find命令將匹配的文件執行exec所給出的shell命令 -exec cmd {} \; (註意: {} 和 \;間的空格)
-ok 同-exec只不過要求對命令的執行進行確認
-name 匹配文件名
find . -name "*.txt" -print
find . -name "[a-z]*" -print
find . -name * -print 或 find . -print
find . -name "[a-z][a-z][0--9][0--9].txt" -print
-perm 匹配權限
find . -perm 755 -print
find . -perm -007 -print
-prune 忽略目錄 (如果使用了-depth選項,則忽略-prune選項) [沒有試用成功]
find /apps -name "/apps/bin" -prune -o -print
-user 匹配用戶
find . -user cnscn -print
-nouser 帳戶屬主已被刪除的文件
find . -nouser -print
-group
-nogroup
-mtime +-n 按更改時間查找文件
find . -mtime -5 -print 查找5日內更改過的文件
find . -mtime +5 -print 查找5日前更改過的文件
-newer file 查找比file更改時間新的文件
! -newerfile2 查找比file更改時間舊的文件
find . -newer a.txt
find . ! -newer a.txt
# date
2006年 09月 13日 星期三 11:16:07 CST
# touch -t 0609120000 a.txt 創建文件a.txt並指定它的更改時間
# ls -l a.txt
-rw-r--r-- 1 root root 0 09-12 00:00 a.txt
-type
f
b
d
c
p
l
-maxdepth 指定遞歸操作的最在目錄深度
# find . -maxdepth 1 -type d
.
./tmp
./mrtg-2.14.5
./piano
./tidy4aug00
-mount 僅在當前的文件系統內進行操作
-fstype
-cpio 將查詢結果進行cpio命令進行操作
find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0
-exec cmd {} \;
-ok cmd {} \;
find . -type f -exec ls -l {} \;
find . -type f -exec rm -f {} \;
find . -type f -ok ls -l {} \;
find . -type f -ok rm -f {} \;
-size n[c]
-depth
-follow
.xargs
功能類似 -exec , 但和-exec不同的是它一次只是取得部分find查詢到的文件結果,而-exec是一次性獲取全部文件結果,容易導致參數太多
# find . -type f -name "*.mp3" -print | xargs ls -l
-rw-r--r-- 1 root root 3985349 09-07 16:05 ./piano/025.mp3
-rw-r--r-- 1 root root 3936256 09-07 16:06 ./piano/duni.mp3
-rw-r--r-- 1 root root 28 09-07 16:23 ./piano/絲絲記憶.mp3
-rw-r--r-- 1 root root 2423745 09-07 16:24 ./piano/異國情.mp3
-rw-r--r-- 1 root root 2967512 09-07 16:20 ./piano/思鄉曲.mp3
-rw-r--r-- 1 root root 4567040 09-07 16:20 ./piano/星空.mp3
.echo
echo -n "string..." 不換行輸出
echo -e "string...\c" 同上
.read variable1 variable2 從標準輸入讀內容到變量
# read name
sssssssssss
# echo $name
sssssssssss
.文件重定向
cmd > file 結果輸出到文件file
cmd >> file 結果附加到文件file
cmd 1> file 結果輸出到文件file
cmd 2> file 標準錯誤輸出到文件file
cmd > file 2>&1 結果和標準錯誤輸出到文件file
cmd < file1 > file2 命令以file1為輸入, 然後以file2為輸出
cmd <cat >>file <>
>ssssssss
>ssaaaaaaa
>HERE
cmd <&m 把文件描述符m作為標準輸入
cmd >&m 把標準輸出重定向到文件描述符m中
cmd <&_ 關閉標準輸入
.&&
cmd1 && cmd2 順序執行命令cmd1和cmd2 (只有cmd1執行成功才會執行cmd2)
.||
cmd1 && cmd2 選擇執行cmd1和cmd2(如果cmd1執行失敗,則執行cmd2)
awk '{print $1,$2}' acc.qtr >qtr.tmp || echo "Error" #如果前面執行錯誤,則報告錯誤
.() 一般很少單獨執行而是和&& || 組合運行
(cmd1;cmd2;cmd3...) 在當前shell中執行一組命令
mail ... || (echo "Error" | mail; exit)
.{} 一般很少單獨執行而是和&& || 組合運行
{cmd1;cmd2;cmd3...} 在子shell中執行一組命令
.正則表達式
^ 匹配行首
$ 匹配行尾
* 匹配0個或多個前面的單個字符
[] 匹配[]內的任意一個字符
\ 轉義
pattern\{n\} 匹配n次pattern
pattern\{n,\} 匹配最少n次pattern
pattern\{n,m\} 匹配n到m次pattern
經常使用的正則表達式
^
$
^[the]
[Ss]igna[lL]
[mayMAY]
^User$
[tty]$ 以tty結尾的行
\.
^d..x..x..x
^[^l]
[.*0]
[000*] 000或更多個
[iI] i或I
[iI][nN] in或iN或In或IN
[^$] 空行
^......$ 含6個字符的行
[a-zA-Z] 任意單個字符
[a-z][a-z]* 到少一個小寫字母
[^0-9\$] 非數字或$
[^0-0A-Za-z] 非數字或字母
[123] 1或2或3
[Dd]evice device或Device
De..ce 以De開始中間兩個任意字符最後是ce
\^q 以^q開始的行
^.$ 只有一個字符的行
^\.[0-9][0-9] 一個句點和兩個數字開始的行
'"Device"' Device
De[Vv]ice\. Device 或 device
[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\} dd-mm-yyyy
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} 匹配IP地址
[^.*$] 匹配任意行
.grep
-E 匹配正則表達式
使用例:
MESSAGE_TYPE="AA BB CC"
RECOVERY_FILE=my.log
BACKUP_FILE_COUNT=3
BACKUP_DIR=/rtt/its/data/recovery/backup/
CP="/bin/cp -p"
RM="/bin/rm -f"
#get parameter from the command line
while getopts D:h options
do
case $options in
D) date=$OPTARG;;
h) echo 'USAG: recovery_alert -D date'
exit 0;;
esac
done
#parameter check: the business date(format:yyyy/mm/dd) is expected
if [ $date = "" ]; then
#parameter not be inputted
exit 1
elif [ `expr "$date" : "[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]$"` -lt 10 ]; then
#parameter format is not yyyy/mm/dd
echo 'business date(format:yyyy/mm/dd) error!'
echo 'USAG: recovery_alert -D date'
exit 1
fi
#get the year, month, date from the business date
year=`echo $date | cut -c 1-4`
month=`echo $date | cut -c 6-7`
day=`echo $date | cut -c 9-10`
#get the recovery file name for the business date
Filename=${RECOVERY_FILE}.${year}${month}${day}
if [ ! -f $Filename ]; then
#the recovery file is not exists
exit 0
fi
#check the recovery file for message leak
for CurType in $MESSAGE_TYPE
do
#count the be leaked messages for 4P, QM, Q1, CP, BP
DataCount=`grep $CurType $Filename | wc -l | awk '{print $1}'`
if [ $DataCount -ne 0 ]; then
TotalDataCount="${TotalDataCount}[${CurType}:${DataCount}]"
fi
done
if [ ! $TotalDataCount = "" ]; then
#if the message leakage is detected, write it into the system log
Message="[$HOSTNAME][$date] Feed data leakage be detected! "${TotalDataCount}
logger -p daemon.notice $Message
#backup the file
$CP $Filename $BACKUP_DIR
if [ $? -ne 0 ]; then
echo "failed to copy the recovery file($Filename) into the backup directory($BACKUP_DIR)"
exit 1
fi
fi
#delete the old files in the backup directory
StartIndex=`expr $BACKUP_FILE_COUNT + 1`
FileList=`ls $BACKUP_DIR | sort -rn | sed -n "$StartIndex,$ p"`
for CurFile in $FileList
do
$RM ${BACKUP_DIR}${CurFile}
if [ $? -ne 0 ]; then
echo "failed to delete the recovery file(${BACKUP_DIR}${CurFile})"
exit 1
fi
done
exit 0
關於 >/dev/null 2>&1的問題
shell中可能經常能看到:>/dev/null 2>&1
命令的結果可以通過%>的形式來定義輸出
分解這個組合:“>/dev/null 2>&1” 為五部分。
1:> 代表重定向到哪裏,例如:echo "123" > /home/123.txt
2:/dev/null 代表空設備文件
3:2> 表示stderr標準錯誤
4:& 表示等同於的意思,2>&1,表示2的輸出重定向等同於1
5:1 表示stdout標準輸出,系統默認值是1,所以">/dev/null"等同於 "1>/dev/null"
因此,>/dev/null 2>&1也可以寫成“1> /dev/null 2> &1”
那麽本文標題的語句執行過程為:
1>/dev/null :首先表示標準輸出重定向到空設備文件,也就是不輸出任何信息到終端,說白了就是不顯示任何信息。
2>&1 :接著,標準錯誤輸出重定向 到 標準輸出,因為之前標準輸出已經重定向到了空設備文件,所以標準錯誤輸出也重定向到空設備文件。
說清楚了嗎,大家理解下吧!
順便對比述說下這麽用的好處!
最常用的方式有:
command > file 2>file 與command > file 2>&1
它們 有什麽不同的地方嗎?
首先command > file 2>file 的意思是將命令所產生的標準輸出信息,和錯誤的輸出信息送到file 中.command > file 2>file 這樣的寫法,stdout和stderr都直接送到file中, file會被打開兩次,這樣stdout和stderr會互相覆蓋,這樣寫相當使用了FD1和FD2兩個同時去搶占file 的管道。
而command >file 2>&1 這條命令就將stdout直接送向file, stderr 繼承了FD1管道後,再被送往file,此時,file 只被打開了一次,也只使用了一個管道FD1,它包括了stdout和stderr的內容。
從IO效率上,前一條命令的效率要比後面一條的命令效率要低,所以在編寫shell腳本的時候,較多的時候我們會command > file 2>&1 這樣的寫法。
文章標籤
全站熱搜
留言列表