bash中$(命令)和反引號的區別

概述


bash 腳本命令的編程過程中,經常用到反引號```,也經常用到`$(命令)`,一般我們的常見用法如下:
反引號
內容替換
```bash
bin=`dirname $0`
bin=`cd $bin;pwd`
```
會將反引號裏面的內容解釋爲命令行,開啓子shell,然後去執行命令,然後將輸出結果替換反引號以及其中的命令。

$(命令)

可以分解爲兩個部分,一個是$符號,另外一個是()小括號
$符的作用是變量替換,即用變量的值去替換當前的內容
小括號則是開一個子shell優先去執行小括號內部的命令

差別分析


從前面的描述可以看出,他們都可以用作內容替換,但是他們還是有細微差別。
在$(命令)中,命令部分的內容不會被父shell解析,而反引號的部分卻會被解析,例如`\`,`$`,```

舉個例子
> $(echo "first second"|awk "\$2==\"second\" {print $1}") 執行是成功的,執行結果爲first
> a=`echo "first second"|awk "\$2==\"second\" {print $1}"`執行失敗
> awk: line 1: syntax error at or near ==

原因是反引號內的內容會被父shell解釋,所以\$2被父shell解釋後變成了$2, 而$2在子shell裏面是會被解析的,而默認的
$2代表子shell的第二個參數,顯然爲空,然後繼續被awk解釋,然後就報了上述的錯誤

其實還有另外一個錯誤,print $1,這裏的$符號也是要被父shell解釋的,則是不對的

最後改爲
> `echo "first second"|awk "\\$2==\"second\" {print \\$2}`
正確

說明

 
這兩個命令在使用的時候都會開子shell, 如果使用echo $$;(echo $$)去看的話,發現都是相同的,後面找了下資料發現,
子shell的環境變量是父shell的一個副本,因此$$估計也被copy過來了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章