爲什麼我在運行2)時會得到額外的空行。對我來說1就像2.那麼爲什麼2)中的額外線?什麼時候使用圓括號的Linux差異
1)
export p1=$(cd $(dirname $0) && pwd)
# ^
echo p1
2)
export p2=$(cd $(dirname $0)) && pwd
# ^
echo p2
爲什麼我在運行2)時會得到額外的空行。對我來說1就像2.那麼爲什麼2)中的額外線?什麼時候使用圓括號的Linux差異
1)
export p1=$(cd $(dirname $0) && pwd)
# ^
echo p1
2)
export p2=$(cd $(dirname $0)) && pwd
# ^
echo p2
$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
獲取打印
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
命令,使其更具可讀性。
使用反引號氣餒。使用$(...)代替,你可以很容易地嵌套它,它更容易閱讀。在代碼塊中,它應該可用。 –
因爲cd不會在stdout上打印任何內容。 – anishsane
你打算迴應'$ p1'和'$ p2'嗎?根本區別在於'pwd'的輸出是否被捕獲到變量中。至於空白行,就像是因爲'$(...)'刪除了尾隨的換行符(如果不是空格)。 –