xargs不使用我的“ ls”别名


8

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

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

例如(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
“我的道路上有GNU ls”到底是什么意思?ls您的$PATH环境变量中是否包含GNU 可执行文件的目录,并且该目录是否在/bin包含非GNU ls命令的目录之前(可能是)?请更新您的问题,向我们显示您的实际价值$PATHxargs将执行在您的目录中找到的第一个 ls命令$PATH;它不知道别名。
基思·汤普森

Answers:


9

该命令xargs只能运行命令,而不能运行别名。但是,GNU parallel可以运行以下功能:

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 parallel而不是xargs(parallel -j1如果您想使用单个CPU)。


导出功能仅适用于bash外壳。您可以使用xargs与导出功能,以及: ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
斯特凡Chazelas

哦,这很不错,如果被迫使用xargs,这可能会很有用。
dhag 2015年

env_parallel如果要使用别名或不想导出函数,则可以使用。别名支持:ash,bash,csh,dash,dash,fish,ksh,mksh,pdksh,tcsh,zsh。bash,fish,ksh,mksh,pdksh,sh,zsh支持以下功能。如果您在远程服务器上运行命令,它们甚至可以工作。gnu.org/software/parallel/env_parallel.html
Ole Tange

3

别名替换由外壳程序完成。如果shell试图调用命令foo,并有一个别名foo=bar,它的外壳,替代品foo通过bar这里。

Shell仅对命令执行此操作。(否则,也将替换与别名命令相同的参数。)但是,您的ls位置不是由shell运行的,而是由引起的xargs。因此,外壳不会替代它。

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

别名在外壳内部,程序没有标准化的方式来读取它们。


1
请注意,这样做alias xargs='xargs '会告诉Shell在之后扩展别名xargs
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.