2015-06-21 58 views
1

fish中,是否可以在另一個同名函數內引用或使用函數?例如,fish有一個功能ls/usr/local/share/functions/ls.fish,它設置一些默認參數的基礎上,如操作系統和外殼是否有顏色。我想定義另一個函數,它會爲我設置一些默認顏色,而不會破壞這個其他函數,以防我想使用更新版本的fish函數路徑中使用函數前面的函數

設置別名最簡單的方法似乎是使用command,像這樣:

function ls 
    command ls -F $argv 
end 

文件ls.fish在文件夾~/.config/fish/functions英寸這是用戶定義函數的默認文件夾。這個文件夾和~/.config/fish/functions都在$fish_function_path中,但~/.config/fish/functions後來出現,因此用戶可以設置自己的功能,覆蓋fish的默認功能。然而,隨着fish文件說,

command forces the shell to execute the program COMMANDNAME and ignore 
any functions or builtins with the same name. 

如何重寫一個後來在$fish_function_path定義的別名/功能,無需過度呢?理想情況下,解決方案也會使用相同名稱的內置命令,如cd,根據所引用的文檔也是不可能的,但這不是必需的。

最後,這是一個好主意嗎?如果fish默認不這樣做,那肯定是有原因的吧?

回答

3

慣用的伎倆是複製你想要覆蓋的功能,然後從覆蓋範圍內調用拷貝:

functions --copy ls saved_ls 
function ls 
    saved_ls 
end 

你不能做到這一點在自動加載ls.fish文件,因爲它會導致一個無限循環,但你可以在config.fish

+0

爲什麼會導致無限循環?在'/ usr/local/share/fish/functions/ls.fish'文件後面調用'〜/ .config/fish/functions/ls.fish'文件,對嗎?或者它們同時被調用,並且前一個文件中定義的函數會覆蓋後一個文件中的函數,但是在運行該命令時同時調用這兩個函數? – trysis

+1

它僅通過搜索'$ fish_function_path'找到第一個'ls.fish'。所以'〜/ .config'中的那個會掩蓋'/ usr/local/share'中的那個。它導致無限循環的原因是執行'ls.fish'首先試圖複製'ls',這意味着自動加載'ls',這意味着執行'ls.fish' ... –

+0

明白了,謝謝。這可能是放在文檔中的信息,假設它不在那裏,我是盲目的,沒有看到它。 – trysis