В 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
псевдоним?
ls
исполняемый файл GNU,$PATH
переменной вашей среды, и предшествует ли он каталогу (возможно/bin
), содержащему не-GNUls
команду? Пожалуйста, обновите ваш вопрос, чтобы показать нам фактическую ценность вашего$PATH
.xargs
выполнит первуюls
команду, найденную в каталоге вашего каталога$PATH
; он не знает об псевдонимах.Ответы:
Команда
xargs
может запускать только команды, но не псевдонимы. Параллельно GNU, однако, может запускать функции:Поэтому я бы порекомендовал либо:
Предоставляя xargs полный путь к версии ls, которую вы хотите использовать (или однозначное имя, возможно, в
gls
зависимости от того, как оно было установлено в вашей системе) или, если ваша оболочка это позволяет,Определение
ls
как функция (function ls { gls "$@"; }; export -f ls
в bash) и использование GNU параллельно вместо xargs (parallel -j1
если вы хотите использовать один процессор).источник
bash
оболочкой. Вы также можете использоватьxargs
с экспортированными функциями:ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
env_parallel
если вы хотите использовать псевдонимы или не хотите экспортировать функцию. Псевдонимы поддерживаются в: ash, bash, csh, dash, fish, ksh, mksh, pdksh, tcsh, zsh. Поддерживаются функции: bash, fish, ksh, mksh, pdksh, sh, zsh. Они даже работают, если вы запускаете команды на удаленных серверах. gnu.org/software/parallel/env_parallel.htmlЗамена псевдонима выполняется оболочкой. Если оболочка пытается вызвать команду
foo
, и есть псевдонимfoo=bar
, это оболочка , которая подменяетfoo
наbar
здесь.Оболочка делает это только для команд. (В противном случае аргументы, которые совпадают с командами с псевдонимами, также будут заменены.) Но
ls
здесь вы используете не оболочку, а аргументxargs
. Поэтому оболочка не заменяет его.Затем
xargs
выполняетсяls
, но он не знает об псевдонимах, поэтому он просто запускает первый из найденных в пути.Псевдонимы являются внутренними для оболочки, и для программы не существует стандартного способа их считывания.
источник
alias xargs='xargs '
скажет оболочке расширять псевдонимы послеxargs
.