Development Tip

xargs는 bash 별칭을 인식하지 못합니다.

yourdevel 2020. 12. 5. 10:43
반응형

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

반응형