Xargs는 Bash 별칭을 인식하지 못합니다
-
21-08-2019 - |
문제
다음 명령을 실행하려고합니다.
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에게 단어는 단어가 Newlines에서만 나뉘어져 있다고 말합니다 (기본값 : IFS=$' \t\n'
). 그러나 당신은 이것에주의해야합니다. 일부 스크립트는 변경 사항에 잘 대처하지 않습니다 $IFS
.
다른 팁
Bash를 사용하면 별명 (또는 기능)에 전달되는 Args 수를 다음과 같이 지정할 수도 있습니다.
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
귀하의 경우에는 단지 A입니다 bash
별칭 또는 기능 실행할 프로그램이 없습니다.
시작하는 것이 포함되지만 bash
다음으로 반환 된 각 파일에 대해 find
, 당신은 다음과 같이 작은 쉘 스크립트를 쓸 수 있습니다.
#!/bin/bash
. $(HOME)/.bashrc
func $*
그런 다음 해당 스크립트의 이름을 매개 변수로 전달합니다. xargs
나는 보통 다음과 같이 찾기를 사용합니다.
find . -iname '' -exec cmd '{}' \;
'{}'는 파일 이름으로 대체되고 ; 실행 체인을 종료하려면 필요합니다. 그러나 기능이 작동하지 않으면 Bash를 통해 실행해야 할 수도 있습니다.
find .. |sed -e "s/.*/cmd '&'/"|bash
라인에서 각 파일을 인쇄하고 명령으로 이것을 접두사 한 다음 실행을 위해 배쉬로 파이프합니다. | bash를 먼저 건너 뛰면 어떤 일이 일어날 지 확인하십시오.
노력하다
find . -iname '.#*' -print0 | xargs -0 -L 1 $(foobar)