2016-03-03 80 views
0

爲什麼我在運行2)時會得到額外的空行。對我來說1就像2.那麼爲什麼2)中的額外線?什麼時候使用圓括號的Linux差異

1)

export p1=$(cd $(dirname $0) && pwd) 
#        ^
echo p1 

2)

export p2=$(cd $(dirname $0)) && pwd 
#       ^
echo p2 
+0

使用反引號氣餒。使用$(...)代替,你可以很容易地嵌套它,它更容易閱讀。在代碼塊中,它應該可用。 –

+0

因爲cd不會在stdout上打印任何內容。 – anishsane

+1

你打算迴應'$ p1'和'$ p2'嗎?根本區別在於'pwd'的輸出是否被捕獲到變量中。至於空白行,就像是因爲'$(...)'刪除了尾隨的換行符(如果不是空格)。 –

回答

0
$echo $0 
/bin/bash 
$ echo $(cd $(dirname $0) && pwd) 
/bin 
$ echo $(cd $(dirname $0)) && pwd 

/home/user 
$ 

在第一個表達式中它變成了echo $(cd /bin && pwd)。因此內層2命令在子外殼中執行並返回pwd值,然後回顯該值。

在第二個表達式中,它減少到echo $(cd /bin) && pwd。因此,只有cd命令在子shell中執行並且不返回任何內容(因此缺省情況下,echo僅打印一個空行)。由於回波成功運行(退出代碼= 0)&&結果在真實和pwd cmd是在當前外殼程序運行並pwd獲取打印

0

P1捕捉的cd(空)和pwd輸出。

p2只捕獲cd的輸出,然後在沒有重定向的情況下運行pwd


echo p1打印文字p1(具有換行)。我想你實際上並沒有從你的終端複製粘貼,而是在其他的東西上輸入。


[email protected]:~$ export p2=$(true) && pwd 
/home/peter 
[email protected]:~$ echo "x${p2}x" 
xx 

在子shell不影響父shell的PWD cd,所以我只是取代了true命令,使其更具可讀性。

相關問題