alias(別名)在 shell 中是很是經常使用的,它主要用於給命令起別名,簡化輸入。但主要用於交互場景,在腳本中基本用不到。eval 是一個很是強大的命令,它的功能是將字符串解析成代碼再執行,但也會額外增長不少複雜性,非必要場景儘可能少用。alias 和 eval 看起來好像沒什麼關係,但功能上有類似之處,因此放在一塊兒講。git
最典型的例子是將 ls -l 簡化成 ll:github
% alias ll='ls -l'
% ll
total 0
drwx------ 0 goreliu goreliu 512 Aug 31 13:55 tmux-1000
drwxr-xr-x 0 goreliu goreliu 512 Aug 31 13:37 yaourt-tmp-goreliu複製代碼
alias 的效果至關於直接將字符串替換過來,比較好理解。shell
# 直接運行 alias,會列出全部的 alias
% alias
ll='ls -l'
lla='ls -F --color --time-style=long-iso -lA'
...複製代碼
這樣的 alias 只有在行首出現時,纔會被解析。但 zsh 中還有一種功能更強大的全局 alias,不在行首也能被解析:bash
% alias -g G='| grep'
% ls G tmux
tmux-1000複製代碼
但這樣須要格外注意可能致使的反作用,好比我想建立一個名爲 G 的文件:微信
% touch G
touch: missing file operand
Try 'touch --help' for more information.
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.複製代碼
結果 G 被替換了,只能在 G 兩邊加引號。ide
若是全局 alias 沒用好,可能致使災難性的後果,好比誤刪重要文件(像把某個全局 alias 傳給 rm 後,剛好刪除了 alias 字符串中的某些文件),因此須要執行權衡後再使用,而且用的時候要多加註意。ui
eval 的功能是將字符串做爲代碼來執行。看上去好像很簡單,但實際涉及很複雜的內容,主要是符號轉義致使的語義問題。spa
在 bash 中,eval 的一個重要的使用場景是將變量的值當變量名,而後取它的變量值,相似於 c 語言中指向變量的指針:指針
% str1=str2
% str2=abc
% eval echo \$$str1
abc複製代碼
注意這裏有一個 \ 和兩個 $,緣由是第二個 $ 是和平時同樣,正常取 str1 的值的,而第一個 $ 須要轉義,由於它要在 eval 執行的過程當中取 str2 的值,不能如今就展開。code
這個用法很容易出問題,並且可讀性不好。幸虧 zsh 中無需這麼用,有更好的辦法:
% str1=str2
% str2=abc
% echo ${(P)str1}
abc複製代碼
(P) 專門用於這種場景,不須要再去轉義 $。
此外 eval 有時也用來動態執行代碼,好比一個腳本接受用戶的輸入,而這輸入也是一段腳本代碼,就能夠用 eval 來運行它。但這種用法是極其危險的,由於腳本中可能有各類危險操做,並且 shell 的語法很靈活,很難經過靜態掃描的方法判斷是否有危險操做。不可靠的代碼根本不該該去運行。即便必定要運行,也能夠先寫到文件裏再運行,避免傳過來的代碼影響到自身的邏輯。
但也不是說 zsh 中就徹底沒有必要用 eval 了,在某些特別的場景(好比用於改造語法加語法糖)仍是有用的。但若是要使用,就必定要注意它可能致使的反作用,利弊只能本身權衡了。eval 的具體用法,和 bash 中的基本沒有區別,能夠去網上搜索 bash eval 用法來了解,這裏就不介紹了。
本文簡單介紹了 alias 的用法和 eval 的場景使用場景。alias 很簡單,主要在 .zshrc 裏使用。eval 很複雜,非必要場景儘可能避免使用。
全系列文章地址:github.com/goreliu/zsh…
付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活訂價,歡迎諮詢,微信 ly50247。