xargs无法识别bash别名

时间:2009-02-04 22:12:52

标签: command-line xargs bash

我正在尝试运行以下命令:

find . -iname '.#*' -print0 | xargs -0 -L 1 foobar

其中“foobar”是我的.bashrc文件中定义的别名或函数(在我的例子中,它是一个带有一个参数的函数)。显然xargs不会将这些视为可以运行的东西。有没有一种聪明的方法可以解决这个问题?

6 个答案:

答案 0 :(得分:37)

由于只有您的交互式shell知道别名,为什么不在不通过xargs分析的情况下运行别名?

find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done

如果您确定您的文件名中没有换行符(ick,为什么会这样?),您可以将其简化为

find . -iname '.#*' -print | while read -r i; do foobar "$i"; done

甚至只是find -iname '.#*' | ...,因为默认目录为.,默认操作为-print

还有一个选择:

 IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done

告诉Bash,单词仅在换行符上拆分(默认值:IFS=$' \t\n')。不过,你应该小心这一点;某些脚本无法很好地处理已更改的$IFS

答案 1 :(得分:10)

使用Bash你也可以指定传递给你的别名(或函数)的args数量,如下所示:

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

答案 2 :(得分:5)

这不起作用,因为xargs期望能够exec 程序作为参数。

由于您的foobar只是一个bash别名或函数,因此无法执行任何程序。

虽然它涉及为bash返回的每个文件启动find,但您可以编写一个小的shell脚本:

#!/bin/bash
. $(HOME)/.bashrc
func $*

然后将该脚本的名称作为参数传递给xargs

答案 3 :(得分:3)

在要别名的命令上添加尾随空格会导致其他别名命令扩展:

alias xargs='xargs ' # aliased commands passed to xargs will be expanded

有关更多信息,请参见此答案:
https://stackoverflow.com/a/59842439/11873710

答案 4 :(得分:1)

我通常使用这样的发现:

find . -iname '' -exec cmd '{}' \;

'{}'将替换为文件名,并且\;是必要的终止执行链。但是,如果这对您的函数不起作用,您可能需要通过bash运行它:

find .. |sed -e "s/.*/cmd '&'/"|bash

Find在一行上打印每个文件,sed只是用你的命令作为前缀,然后将它传递给bash执行。首先跳过| bash,看看会发生什么。

答案 5 :(得分:0)

尝试

find . -iname '.#*' -print0 | xargs -0 -L 1 $(foobar)