xargs不能识别bash别名
我试图运行以下命令:
find . -iname '.#*' -print0 | xargs -0 -L 1 foobar
其中“foobar”是在我的.bashrc文件中定义的别名或函数(在我的情况下,它是一个函数,只有一个参数)。 显然,xargs并不认为它是可以运行的。 有没有一个聪明的办法来解决这个问题?
由于只有你的交互式shell知道别名,为什么不直接运行别名而不用通过xargs
分出呢?
find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done
如果你确定你的文件名没有换行符(ick,为什么他们?),你可以简化为
find . -iname '.#*' -print | while read -ri; do foobar "$i"; done
甚至只是find -iname '.#*' | ...
find -iname '.#*' | ...
,因为默认目录是.
而默认的操作是-print
。
另一个select:
IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done
告诉Bash单词只在换行符上分割(默认: IFS=$' \t\n'
)。 不过,你应该小心一点, 一些脚本不能很好地处理更改的$IFS
。
使用Bash,你也可以指定传递给别名(或函数)的参数数目,如下所示:
alias myFuncOrAlias='echo' # alias defined in your ~/.bashrc, ~/.profile, ... echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0 echo arg1 arg2 | xargs bash -cil 'myFuncOrAlias "$@"' arg0
这是行不通的,因为xargs
希望能够exec
作为其参数给出的程序 。
由于在你的情况foobar
只是一个bash
别名或function没有程序来执行。
虽然它涉及到由find
返回的每个文件的开始bash
,您可以编写一个小的shell脚本:
#!/bin/bash . $(HOME)/.bashrc func $*
然后将该脚本的名称作为parameter passing给xargs
我通常使用这样的发现:
find . -iname '' -exec cmd '{}' \;
“{}”将被replace为文件名,而\ 有必要终止执行链。 但是,如果这不适用于你的函数,你可能需要通过bash运行它:
find .. |sed -e "s/.*/cmd '&'/"|bash
查找打印每一个文件在一行,sed只是用你的命令前缀,然后pipe它打到执行。 先跳过bash,看看会发生什么。