별명은 정의 된 쉘 내부에 있습니다. 다른 프로세스에서는 볼 수 없습니다. 쉘 기능도 마찬가지입니다. xargs
쉘이 아닌 별도의 응용 프로그램이므로 별칭 또는 함수 개념이 없습니다.
xargs가 grep
직접 호출하는 대신 쉘을 호출하도록 할 수 있습니다. 그러나 쉘을 호출하는 것만으로는 충분하지 않으므로 해당 쉘에서 별명도 정의해야합니다. 에 별칭이 정의되어 있으면 .bashrc
해당 파일을 소싱 할 수 있습니다. 그러나 .bashrc
비 대화식 셸에서는 이해가되지 않는 다른 작업을 수행 하면 작동 하지 않을 수 있습니다.
find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E regex_here "$@"' _
정규 표현식을 입력 할 때 중첩 인용의 복잡성을주의하십시오. regexp를 매개 변수로 쉘에 전달하여 수명을 단순화 할 수 있습니다.
find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E "$0" "$@"' regex_here
별칭 조회를 명시 적으로 수행 할 수 있습니다. 그러면 xargs
을 볼 수 grep -n --color=always
있습니다.
find . -name '*.py' | xargs "${BASH_ALIASES[grep]}" regex_here
zsh에서 :
find . -name '*.py' | xargs $aliases[grep] regex_here
그건 그렇고, find … | xargs …
공백이 포함 된 파일 이름 (다른 것들 중에서도)에 유의하십시오 . 널로 구분 된 레코드로 변경하여이 문제를 해결할 수 있습니다.
find . -name '*.py' -print0 | xargs -0 "${BASH_ALIASES[grep]}" regex_here
또는 -exec
:
find . -name '*.py' -exec "${BASH_ALIASES[grep]}" regex_here {} +
을 호출하는 대신 find
쉘 내부에서 모든 것을 할 수 있습니다. glob 패턴 **/
은 디렉토리를 재귀 적으로 탐색합니다. bash에서는 shopt -s globstar
이 glob 패턴을 먼저 활성화 하기 위해 실행해야합니다 .
grep regex_here **/*.py
몇 가지 제한 사항이 있습니다.
- 많은 파일이 일치하거나 긴 경로를 가진 경우 최대 명령 줄 길이를 초과하여 명령이 실패 할 수 있습니다.
- bash ≤4.2 (최신 버전이나 ksh 또는 zsh는 아님)에서
**/
디렉토리에 대한 심볼릭 링크로 반복됩니다.
또 다른 방법은 MariusMatutiae에서 제안한대로 프로세스 대체 를 사용하는 것 입니다.
grep regex_here <(find . -name '*.py')
**/
적용 할 수없는 경우에 유용합니다 . 복잡한 find
표현식의 경우 또는 bash ≤4.2에서 심볼릭 링크 아래에서 재귀하지 않으려 는 경우에 유용 합니다. 공백이 포함 된 파일 이름이 끊어집니다. 해결 방법은 globbing 을 설정 IFS
및 비활성화하는 것이지만 약간 복잡해지기 시작합니다.
(IFS=$'\n'; set -f; grep regex_here <(find . -name '*.py') )