xargs는 내 "ls" 별칭을 사용하지 않습니다.

xargs는 내 "ls" 별칭을 사용하지 않습니다.

AIX에서는(그러나 이는 HP-UX에서도 발생함) 내 경로에 ls.

xargs를 사용하면 ls별칭 대신 표준 Unix를 사용합니다.

예를 들어 ( 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 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).

그래서 나는 다음을 추천합니다:

  • 사용하려는 ls 버전의 전체 경로(또는 gls시스템에 설치된 방법에 따라 명시적인 이름)를 xargs에 제공하거나, 쉘에서 허용하는 경우

  • ls함수로 정의하고 ( function ls { gls "$@"; }; export -f lsbash에서) xargs 대신 GNU 병렬 처리를 사용합니다( parallel -j1단일 CPU를 사용하려는 경우).

답변2

별칭 교체는 쉘에 의해 수행됩니다. 쉘이 명령 호출을 시도 foo하고 별칭이 존재하는 경우 foo=bar쉘은 foo여기를 대체합니다 bar.

쉘은 명령에 대해서만 이 작업을 수행합니다. (그렇지 않으면 별칭이 지정된 명령과 동일한 인수도 대체됩니다.) 하지만 여기에 있는 것은 ls셸에 의해 실행되는 것이 아니라 xargs.

그런 다음 xargs를 실행 ls하지만 별칭을 모르므로 경로에서 찾은 첫 번째 별칭만 실행합니다.

별칭은 셸 내부에 있으며 프로그램에서 별칭을 읽는 표준화된 방법이 없습니다.

관련 정보