2009-01-15 28 views
18

有沒有在bash中實現/使用lambda函數的方法?我想的是這樣的:bash中的lambda函數

$ someCommand | xargs -L1 (lambda function) 

回答

19

我不知道的方式做到這一點,但你可以做到你想用做什麼:

somecommand | while read -r; do echo "Something with $REPLY"; done 

這也會更快,因爲你不會爲每一行文本創建一個新的進程。

[編輯2009-07-09] 我做了兩個轉變:

  1. 結合了使用-r禁用反斜線處理litb的建議 - 這意味着在輸入反斜槓將被傳遞通過不變。
  2. 除了提供變量名稱(例如X)作爲參數read,我們讓read分配給其默認變量REPLY。這具有保留前導空間和尾隨空間的愉悅副作用,即使內部空間被保留,也會被剝離。

根據我的觀察,這些更改一起保留了除每個輸入行上的文字NUL(ASCII 0)字符外的所有內容。

[EDIT 26/7/2016]

據評論者Evi1M4chine,運行read X(例如,與命令IFS='' read X)也應保持在開始和結束時的空間之前設置$IFS爲空字符串將結果存儲到$X,這意味着您不必使用$REPLY

+1

+1,這是真棒! – orip 2009-01-15 19:53:38

+0

我想這個方法在過去的問題是它對於沒有空格的字符串很有用。例如,如果的輸出是文件列表,其中一些文件有空格,則「讀取X」失敗。我已經在某處讀過如何處理這個問題,但似乎從未回憶過這些細節。 – Daniel 2009-01-29 19:58:38

3

這是怎麼回事?

somecommand | xargs -d"\n" -I{} echo "the argument is: {}" 

(假定每個參數是一條線,以其它方式改變分隔符)

1

如果想僅xargs的(例如由於平行-P N選項),並且僅bash作爲功能代碼,然後bash -c可以用作xargs的參數。

seq 1 10 | tr '\n' '\0' | xargs -0 -n 1 bash -c 'echo any bash code $0' 

tr和-0選項在此處用於禁用任何xargs參數替換。

7

如果你想要真正的函數,而不僅僅是管道或while循環(例如,如果你想傳遞它們,就好像它們是數據)我只是不做lambda表達式,並定義具有重複虛擬名稱的虛擬函數,馬上使用,然後扔掉。像這樣:

​​

就像在適當的函數式語言,就沒有必要來傳遞參數,你可以在一個閉合將它們包裝:

# Let’s say you have a function with three parameters 
# that you want to use as a lambda: 
# (As in: Partial function application.) 
trio(){ echo "$1 Lambda sees $3 $2"; } 

# And there are two values that you want to use to parametrize a 
# function that shall be your lambda. 
pre="<<<" 
post=">>>" 

# Then you’d just wrap them in a closure, and be done with it: 
λ(){ trio "$pre" "$post" "[email protected]"; }; map λ * 

我認爲它比其他更短解決方案介紹在這

0

是的。可以傳遞一個表示命令調用的字符串變量,然後用eval執行該命令。

例子:

command='echo howdy' 
eval "$command"