xargs를 사용하여 쉘 스크립트에 전달된 명령줄 인수를 사용하는 방법은 무엇입니까?

xargs를 사용하여 쉘 스크립트에 전달된 명령줄 인수를 사용하는 방법은 무엇입니까?

일련의 git 체크아웃을 반복하고 각 디렉토리에서 git 명령을 실행하는 스크립트가 있습니다.

이제 명령줄에서 셸 스크립트에 인수를 전달하고 해당 인수를 실행 중인 git 명령에 통합할 수 있기를 원합니다.

저는 다음 스크립트를 테스트로 사용하고 있습니다(표시되는 매개변수를 볼 수 있을 때까지 git 명령을 제거했습니다).

#!/usr/bin/env bash
find . -type d -exec test -e '{}/.git' ';' -print -prune | xargs -P 1 -I {} sh -c 'cd {}; echo `pwd` $1; echo ""'

인수가 포함된 명령을 실행하면 .git 디렉터리와 인수가 포함된 디렉터리의 이름이 표시될 것으로 예상됩니다.

디렉터리 이름만 가져옵니다.

많은 노력 끝에 이걸로 끝이었는데..

#!/usr/bin/env bash
find . -type d -exec test -e '{}/.git' ';' -print -prune | BRANCH="$1" xargs -P 1 -I {} sh -c 'cd {}; echo `pwd` "${BRANCH}"; echo ""'

제가 누락된 정비사가 있나요? 주장을 전달하는 "더 나은" 방법이 있습니까?

답변1

쉘 스크립트 내에서 인라인 스크립트를 사용하여 다른 쉘을 호출할 수 있습니다. 이 스크립트를 작은따옴표로 묶어서 $1그대로 전달됩니다. 방금 시작한 새 셸에는 자체 매개변수 집합이 있지만 비어 있습니다. 따라서 구문 분석할 때 $1null로 확장됩니다 .

작업 예제에서는 새 셸에 표시되는 새 변수에 값을 할당합니다.


모든 git 저장소를 찾으려면 all-git아래 스크립트를 복사할 수도 있습니다. 사용법은 간단합니다. all-git <git command>예를 들어all-git status -bs

#!/bin/bash

for repo in `find $PWD -type d -name .git`
do
    repo=${repo%.git}
    ( 
        cd $repo
        echo "${repo%/}: " | sed -e "s#$HOME#~#"
        git "$@"
    )
done

답변2

find . -type d -exec test -e '{}/.git' ';' -print -prune | \
    xargs -P $(nproc) -I {} sh -c "cd \"{}\"; echo \"\$(pwd) $1\"; echo "

작동해야 하지만 내보낸 함수를 호출할 수도 있습니다.

OPT="$1"
function doGitWork {
    DIR="$1"
    cd "$DIR"
    echo "$(pwd) $OPT"
}
export -f doGitWork
find . -type d -exec test -e '{}/.git' ';' -print -prune | \
    xargs -P $(nproc) -I {} sh -c "doGitWork \"{}\";"

답변3

GNU Parallel을 사용하면 다음과 같습니다:

find . -type d -exec test -e '{}/.git' ';' -print -prune |
    parallel 'cd {}; echo $(pwd) {}; echo'

git pull디렉토리가 있는 모든 디렉토리에서 다음을 수행 하려면 다음을 수행하십시오 .git.

allgit() {
  find . -type d -name .git | 
      parallel --tagstring {//} "cd {//}; git $@"
}
allgit pull

관련 정보