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 ls
bash에서) xargs 대신 GNU 병렬 처리를 사용합니다(parallel -j1
단일 CPU를 사용하려는 경우).
답변2
별칭 교체는 쉘에 의해 수행됩니다. 쉘이 명령 호출을 시도 foo
하고 별칭이 존재하는 경우 foo=bar
쉘은 foo
여기를 대체합니다 bar
.
쉘은 명령에 대해서만 이 작업을 수행합니다. (그렇지 않으면 별칭이 지정된 명령과 동일한 인수도 대체됩니다.) 하지만 여기에 있는 것은 ls
셸에 의해 실행되는 것이 아니라 xargs
.
그런 다음 xargs
를 실행 ls
하지만 별칭을 모르므로 경로에서 찾은 첫 번째 별칭만 실행합니다.
별칭은 셸 내부에 있으며 프로그램에서 별칭을 읽는 표준화된 방법이 없습니다.