xargs 不使用我的“ls”别名

xargs 不使用我的“ls”别名

在 AIX 上(但在 HP-UX 上也会发生这种情况),我的路径中有 GNU ls,它的别名也为ls.

当我使用 xargs 时,它使用标准 Unixls而不是别名。

例如(flocate是一个找到搜索主题的确切路径的函数):

flocate mirrorvg | xargs ls -lh
ls: illegal option -- h
usage: ls [-1ACFHLNRSabcdefgiklmnopqrstuxEUX] [File...]

ls -lh /usr/sbin/mirrorvg
-r-xr-x--- 1 root system 37K apr  3  2014 /usr/sbin/mirrorvg*

为什么 xargs 不使用ls别名?

答案1

该命令xargs只能运行命令,不能运行别名。然而,GNU 并行能够运行函数:

The command must be an executable, a script, a composed
command, or a function. If it is a function you need to export
-f the function first. An alias will, however, not work (see
why http://www.perlmonks.org/index.pl?node_id=484296).

所以我会推荐:

  • 为 xargs 提供您想要使用的 ls 版本的完整路径(或一个明确的名称,可能gls取决于它在您的系统上的安装方式),或者,如果您的 shell 允许,

  • 定义ls为函数(function ls { gls "$@"; }; export -f ls在 bash 中)并使用 GNU 并行而不是 xargs(parallel -j1如果您想使用单个 CPU)。

答案2

别名替换由 shell 完成。如果 shell 尝试调用 command foo,并且存在别名foo=bar,则 shell 会foobar此处替换 。

shell 只对命令执行此操作。 (否则,恰好与别名命令相同的参数也会被替换。)但是您的ls此处不是由 shell 运行,而是xargs.因此,外壳并不能取代它。

然后xargs执行ls,但它不知道别名,因此它只运行在路径中找到的第一个别名。

别名是 shell 内部的,程序没有标准化的方法来读取它们。

相关内容