2017-10-13 32 views
2

有沒有一種方法可以將這一個班輪放到bash函數中?在bash函數中使用管道

mdfind -name autoflush.py | grep -Ev 'Library|VMWare|symf|larav' | sort 

我試圖做這樣的:

function mdf() { mdfind -name "$1" | grep -Ev 'Library|VMWare|symf|larav' | sort } 

,但沒有與它的成功。

我不能在bash中的函數中使用管道運算符嗎?

我的下一個方法是這樣的:

function mdf() { 
    result=mdfind -name "$1" 
    grepped_result=grep -Ev 'Library|VMWare|symf|larav' $result 
    sort $grepped_result # return sort $grepped_result ? 
} 

我猜有我的辦法很多概念性的錯誤。所以我會很感激任何幫助和意見。

+1

第二次嘗試有三個問題:將命令的輸出分配給變量時,需要使用'$()'來捕獲輸出。例如,'result = $(mdfind -name「$ 1」)''。其次,'grep'和'sort'將文件*名稱*作爲參數,而不是數據;你必須使用'echo'並將其輸出傳送給命令。第三,幾乎總是需要對變量引用進行雙引號操作,以防止分詞和通配符擴展(例如'echo「$ result」'而不是'echo $ result')。 –

回答

4

你在第一次嘗試時錯過了一個分號。

mdf() { mdfind -name "$1" | grep -Ev 'Library|VMWare|symf|larav' | sort; } 

只是你需要它的shell語法的怪癖。如果你把命令放在自己的路線上,那麼你不需要它。

mdf() { 
    mdfind -name "$1" | grep -Ev 'Library|VMWare|symf|larav' | sort 
} 

(我已經刪除了function關鍵字。出於兼容性的緣故,你應該寫要麼func()function func而不是將它們結合起來。)

shellcheck.net一個嘗試下一次你就完蛋了。這是一個shell腳本的語法檢查器。真是天賜之物。