首頁 > FreeBSD, Linux, Share > 學習 10 個使用 UNIX 的好習慣

學習 10 個使用 UNIX 的好習慣

2007年1月11日 snese 發表評論 閱讀評論

原文在此:Learn 10 good UNIX usage habits

在這主要是濃縮他所談的,再用我的話來簡敘、翻譯。

用一個指令建立樹狀的資料夾

這邊他要教的是使用 mkdir-p option ,它能幫助你一個指令就建立起一整串的資料夾。這邊提供幾個範例讓大家瞧瞧,第一個是直線的建立法,指令也很直覺,大家應該一看就懂。

~ $ mkdir -p tmp/a/b/c

至於這個則是每層都有支幹的建立法

~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

更加詳細的解說請看,這一段

利用控制運算子來合併指令

控制運算子,用中文翻還蠻繞舌的。其實它們就是 &&|| ( and 和 or ),當然這邊有舉幾個例子,邊看邊解說會比較好懂。這個例子是介紹 && ,整個指令的意思是,當前半段的指令(&&前)完成時,接著會進行 tar 的那個動作。

~ $ cd tmp/a/b/c && tar xvf ~/archive.tar

而這個例子則是當前半段無法完成時,就進行後面的 mkdir。

~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c

這邊則是個組合的例子,如果前面懂的話,就會知道它會怎麼跑。

~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar

其中有些解說,我都跳掉了。想知道的更詳盡請看這段

謹慎的使用雙引號

他在這邊提到,除非你有夠好的理由,不然利用雙引號把變數包起來真的是個好的習慣。至於為什麼要這麼說呢?看看這下面有雙引號和沒雙引號的例子你就知了!更多的資訊請看這裡

~ $ ls tmp/
a b
~ $ VAR="tmp/*"
~ $ echo $VAR
tmp/a tmp/b
~ $ echo "$VAR"
tmp/*
~ $ echo $VARa

~ $ echo "$VARa"

~ $ echo "${VAR}a"
tmp/*a
~ $ echo ${VAR}a
tmp/a
~ $

利用 backslash 來避免輸入過長

如果有遇到輸入要超過視窗時,建議您使用 backslash ( \ ) 來分行輸入。其中的好處是,如果有使用組合指令,可以很清楚的分類,而不用通通塞在一起殘害自己的腦和眼睛。以下有幾個良好的示範,大家可以看看。

~ $ cd tmp/a/b/c || \
> mkdir -p tmp/a/b/c && \
> tar xvf -C tmp/a/b/c ~/archive.tar

~ $ cd tmp/a/b/c \
> || \
> mkdir -p tmp/a/b/c \
> && \
> tar xvf -C tmp/a/b/c ~/archive.tar

把指令做群組的分配

這樣的好處就好比是程式的 function ,當你把指令綁起來變成一個群組時,接下要再做什麼額外的處理都會方便的許多。以下的例子可以參考看看,原文則在這邊

~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && \
> VAR=$PWD; cd ~; tar xvf -C $VAR archive.tar ) \
> | mailx admin -S "Archive contents"

~ $ { cp ${VAR}a . && chown -R guest.guest a && \
> tar cvf newarchive.tar a; } | mailx admin -S "New archive"

利用 xargs 來過濾 find 的結果

其實 xargs 功能很強大,不過我已經快睡著了,一時也想不到有什麼比較簡易的解釋方法。在這就直接丟上他的範例和原本的說明頁面

~/tmp $ ls -1 | xargs
December_Report.pdf README a archive.tar mkdirhier.sh
~/tmp $ ls -1 | xargs file
December_Report.pdf: PDF document, version 1.3
README: ASCII text
a: directory
archive.tar: POSIX tar archive
mkdirhier.sh: Bourne shell script text executable
~/tmp $

~/tmp $ ls -l | xargs
-rw-r–r– 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r–r– 1 \ root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02 \ 16:07 a -rw-r–r– 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1 \ joe joe 3239 Sep 30 12:40 mkdirhier.sh
~/tmp $

知道哪時該用 grep 做計算,哪時不需要

在第一個例子裡,它比較了pipe to wc -l 和只使用 grep -c 的速度。根據範例很明顯的是 grep -c 勝出,但這個結果是指當你只想找有多少行含有你要的 keyword,而非 keyword 的總數量,現在讓我們來看看範例。

~ $ time grep and tmp/a/longfile.txt | wc -l
2811
real 0m0.097s
user 0m0.006s
sys 0m0.032s
~ $ time grep -c and tmp/a/longfile.txt
2811
real 0m0.013s
user 0m0.006s
sys 0m0.005s
~ $

~ $ grep -o and tmp/a/longfile.txt | wc -l
3402
~ $

如果覺得講得不夠詳盡,可參考此一小節

利用 awk 讓搜尋結果更加精確

這邊用兩個例子,來讓你了解怎樣讓結果更加的精確。第一個為未使用 awk 的狀況:

~/tmp $ ls -l /tmp/a/b/c | grep Dec
-rw-r–r– 7 joe joe 12043 Jan 27 20:36 December_Report.pdf
-rw-r–r– 1 root root 238 Dec 03 08:19 README
-rw-r–r– 3 joe joe 5096 Dec 14 14:26 archive.tar
~/tmp $

當使 awk 來指定比對的位置時,結果就更加的精確。

~/tmp $ ls -l | awk ‘$6 == "Dec"
-rw-r–r– 3 joe joe 5096 Dec 14 14:26 archive.tar
-rw-r–r– 1 root root 238 Dec 03 08:19 README
~/tmp $

除了原文章節的連結,這邊還附上如何使用 awk 的說明。

別再使用 cat 做 piping

由下面的例子可以知道,用完 cat 再 pipe 給 grep 其實是件不必要且浪費時間的事。更多的內文可以看這裡

~ $ time cat tmp/a/longfile.txt | grep and
2811
real 0m0.015s
user 0m0.003s
sys 0m0.013s
~ $ time grep and tmp/a/longfile.txt
2811
real 0m0.010s
user 0m0.006s s
ys 0m0.004s
~ $

結論

養成好的使用習慣,不但提昇自己的工作效率,也能避免掉一些不在預期的錯誤發生,對自己的 commend-line 技巧更會提升不少。俗話說得好,"好的習慣讓你上天堂,不好的習慣只能讓你住套房" XD 希望這些對大家有點幫助。

  1. 聚丙烯酰胺
    2009年7月2日15:14 | #1

    路过,顶一下啊!

  1. 目前尚無任何 trackbacks 和 pingbacks。