如何在xargs中使用别名命令?

我在我的.aliases中有以下别名:

alias gi grep -i 

我想在所有名称中包含string的文件中查找foo不区分大小写的文件:

 find -name \*bar\* | xargs gi foo 

这是我得到的:

 xargs: gi: No such file or directory 

有没有办法在xargs中使用别名,还是我必须使用完整版本:

  find -name \*bar\* | xargs grep -i foo 

注意:这是一个简单的例子。 除了gi我还有一些非常复杂的别名,我不能这么容易地手动扩展。

编辑:我用tcsh ,所以请指定一个答案是特定于shell的。

Solutions Collecting From Web of "如何在xargs中使用别名命令?"

别名是特定于shell的 – 在这种情况下,最有可能是特定于bash的。 要执行一个别名,你需要执行bash,但只有加载交互式shell的别名(更确切地说, .bashrc只能在交互式shell中被读取)。

bash -i运行一个交互式shell(和源码.bashrc)。 bash -c cmd运行cmd

将它们放在一起: bash -ic cmd在交互式shell中运行cmd ,其中cmd可以是在.bashrc定义的bash函数/别名。

 find -name \*bar\* | xargs bash -ic gi foo 

应该做你想做的。

编辑:我看到你已经标记为“tcsh”的问题,所以特定于bash的解决方案是不适用的。 用tcsh,你不需要-i ,因为它似乎读取.tcshrc,除非你给-f

尝试这个:

 find -name \*bar\* | xargs tcsh -c gi foo 

它为我的基本测试工作。

把“gi”改成一个脚本

例如在/home/$USER/bin/gi

 #!/bin/sh exec /bin/grep -i "$@" 

不要忘记标记文件的可执行文件。

这里的建议是避免xargs并使用“while read”循环而不是xargs:

 find -name \*bar\* | while read file; do gi foo "$file"; done 

在上面的链接中查看接受的答案,以处理文件名中的空格或换行符。

对于tcsh(没有函数),你可以使用:

 gi foo `find -name "*bar*"` 

对于bash / ksh / sh,你可以在shell中创建一个函数。

  function foobar { gi $1 `find . -type f -name "*"$2"*"` } foobar foo bar 

请记住,在shell中使用反引号比从多个角度使用xargs更有优势。 将函数放在.bashrc中。

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

 alias myFuncOrAlias='echo' # alias defined in your ~/.bashrc, ~/.profile, ... echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0 

(应该以类似的方式为tcsh工作)

 # alias definition in ~/.tcshrc echo arg1 arg2 | xargs -n 1 tcsh -cim 'myFuncOrAlias "$1"' arg0 # untested 

这是特别安全的:

 find . -print0 | xargs -0 bash -ic 'echo gi foo "$@"' -- 

-print0-0使用\0NUL终止的字符串,所以当文件名中有空格时,不会发生奇怪的事情。

bash将命令字符串后的第一个参数设置为$0 ,所以我们传递一个虚拟参数( -- ),这样find列出的第一个文件不会被$0消耗。