2009-01-15 66 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"