學習 10 個使用 UNIX 的好習慣
原文在此: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 $
別再使用 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 希望這些對大家有點幫助。
路过,顶一下啊!