2016-04-05 82 views
0

我試着從zsh和bash來的魚殼。我非常想念$_位置參數,並試圖用函數來模仿它。如何評估魚的變量

魚在$history數組中包含其命令歷史記錄,其中$history[1]是歷史上的前一行,$history[2]是之前的那一行,依此類推。

我試圖評估該變量並提取這樣

ls -al 
echo $history[1] | awk '{print $NF}'   // Prints -al 

我試圖把它放在這樣的函數

function \$_ --description 'Fish-patch for the $_ positional parameter' 
    echo $history[1] | awk '{print $NF}' 
end 

的最後一個字,但它不是做得比較作爲工作預期。調用$_本身按預期工作;

ls -al 
$_  

它打印-al。但是,如果$_作爲參數傳遞給函數;

ls -al 
echo $_ 

它打印echo。我懷疑它與$_-函數在子shell或其他東西中被評估有關,我真的不知道。

這裏有什麼問題?爲什麼echo $_不按預期工作?

回答

4

在魚,$_是隻讀包含上次前景化工作變量。但是,您可以使用$__或其他字符。

最簡單的方法是每一個命令後只更新$__

function update_last_arg --on-event fish_postexec 
    set -g __ (echo $argv | awk '{print $NF}') 
end 

現在$__總是包含最後一個參數。

0

因爲魚沒有全局別名。你給echo的參數只是字符串,它們不會被視爲代碼。

你必須這樣做,這減少了它的可用性。

echo ($_) 

我發現(地方)執行bash的歷史般!!!$的方法:

function fish_user_key_bindings 
    bind ! bind_bang 
    bind '$' bind_dollar 

    # enable editing command line in editor with Alt+v 
    bind \ev bind_edit_commandline 
end 
function bind_bang 
    switch (commandline -t)[-1] 
    case "!" 
     commandline -t $history[1]; commandline -f repaint 
    case "*" 
     commandline -i ! 
    end 
end 
function bind_dollar 
    switch (commandline -t)[-1] 
    case "!" 
     commandline -t "" 
     commandline -f history-token-search-backward 
    case "*" 
     commandline -i '$' 
    end 
end