2014-02-27 70 views
1

實際上,我無法理解這樣的代碼的末尾:

function mkdircd() { 
    mkdir -p "[email protected]" && eval cd "\"\$$#\""; 
} 

EVAL是一個命令,但什麼符號結束的意思? --->cd "\"\$$#\""

$mkdir -p /tmp/foo/bar/ 
$cd /tmp/foo/bar 
$pwd 
/tmp/foo/bar 

添加此功能到的.bashrc

$mkdircd /tmp/foo/bar/ 
$pwd 
/tmp/foo/bar/ 
+0

爲什麼不'的mkdir -p「$ @」 && CD「 $ @「;'?我不明白... – Depado

+0

@devnull:不,'$#'首先擴展到參數的數量,然後當第一個美元和參數的數量擴展到最後論點 –

+0

@Depado因爲你只能提供一個參數給'cd' – Barmar

回答

6

eval接收作爲參數並評估其作爲外殼命令;所以在正常情況下,您在源代碼中看到的內容會進行兩次評估(一次構建eval命令時,一次會在eval運行時再次執行)。

這個雙重評估(shell變量替換,轉義等)有點誇大了語法,所以它看起來像亂碼。

cd "\"\$$#\"" 

評估爲

cd "$4" 

(假設$#4)。而且,當eval運行時,將評估爲

cd /my/new/path 

(假設$4/my/new/path)。

爲什麼那$#的事?因爲你的shell函數將創建所有路徑,你將它傳遞給它,然後嘗試cd進入最後給定路徑(如果給出四條路徑,則爲$4)。

+1

(無視我的評論,我錯過了逃脫的$) –

+0

在我的bash上,我試過'函數tt(){eval echo \「\」$$#\「\」; }''但是'$$'在'$#'之前被賦值給我結果'6148#',這是我的進程ID。 – RedX

+3

@RedX:但這不是OP給的。您錯過了第一個美元前的逃跑 –

0

注意,在bash,有訪問最後函數參數(這是什麼eval cd "\"\$$#\""做一個更安全的方式。

cd "${@: -1}"