xargs는 bash 별칭을 인식하지 못합니다.
다음 명령을 실행하려고합니다.
find . -iname '.#*' -print0 | xargs -0 -L 1 foobar
여기서 "foobar"는 .bashrc 파일에 정의 된 별칭 또는 함수입니다 (제 경우에는 하나의 매개 변수를 사용하는 함수입니다). 분명히 xargs는 이것을 실행할 수있는 것으로 인식하지 못합니다. 이 문제를 해결하는 영리한 방법이 있습니까?
대화 형 셸만 별칭에 대해 알고 있기 때문에 분기없이 별칭을 실행하는 것은 xargs
어떻습니까?
find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done
파일 이름에 줄 바꿈이없는 것이 확실한 경우 (ick, 왜 그럴까요?) 다음과 같이 단순화 할 수 있습니다.
find . -iname '.#*' -print | while read -r i; do foobar "$i"; done
또는 find -iname '.#*' | ...
기본 디렉토리는 .
이고 기본 작업은 -print
입니다.
또 다른 대안 :
IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done
Bash에게 단어가 줄 바꿈으로 만 분할된다는 것을 알려줍니다 (기본값 :) IFS=$' \t\n'
. 그래도 조심해야합니다. 일부 스크립트는 변경된 $IFS
.
Bash를 사용하면 다음과 같이 별칭 (또는 함수)에 전달되는 인수의 수를 지정할 수도 있습니다.
alias myFuncOrAlias='echo' # alias defined in your ~/.bashrc, ~/.profile, ...
echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0
echo arg1 arg2 | xargs bash -cil 'myFuncOrAlias "$@"' arg0
때문에 작동하지 않습니다 xargs
예상하는가 할 수 프로그램 의 매개 변수로 주어진.exec
foobar
귀하의 경우에는 bash
별칭 또는 함수 일뿐 이므로 실행할 프로그램이 없습니다.
에서 bash
반환 된 각 파일에 대해 시작 하는 것이 포함되지만 다음과 find
같이 작은 쉘 스크립트를 작성할 수 있습니다.
#!/bin/bash
. $(HOME)/.bashrc
func $*
그런 다음 해당 스크립트의 이름을 매개 변수로 xargs
나는 보통 다음과 같이 find를 사용합니다.
find . -iname '' -exec cmd '{}' \;
'{}'는 파일 이름으로 대체되고 \; 실행 체인을 종료하는 데 필요합니다. 그러나 함수에서 작동하지 않으면 bash를 통해 실행해야 할 수도 있습니다.
find .. |sed -e "s/.*/cmd '&'/"|bash
Find는 각 파일을 한 줄에 인쇄하고 sed는 명령 앞에 접두사를 붙인 다음 실행을 위해 bash로 파이프합니다. 어떤 일이 발생하는지 확인하려면 먼저 bash를 건너 뛰십시오.
시험
find . -iname '.#*' -print0 | xargs -0 -L 1 $(foobar)
참고 URL : https://stackoverflow.com/questions/513611/xargs-doesnt-recognize-bash-aliases
'Development Tip' 카테고리의 다른 글
Koa / Co / Bluebird 또는 Q / Generators / Promises / Thunks 상호 작용? (0) | 2020.12.05 |
---|---|
AAR에 전 이적 종속성이 포함될 수 있습니까? (0) | 2020.12.05 |
Windows Vista에서 Visual Studio 캐시를 어떻게 지우나요? (0) | 2020.12.04 |
종속성 속성에서 속성 변경 이벤트를 발생시키는 방법은 무엇입니까? (0) | 2020.12.04 |
중요한 매개 변수 / 종속성이 누락 된 경우 어떤 예외가 발생합니까? (0) | 2020.12.04 |