find(fd)는 사용자 정의 함수와 여러 매개변수를 사용하여 실행됩니다.

find(fd)는 사용자 정의 함수와 여러 매개변수를 사용하여 실행됩니다.

나는 bash 스크립팅을 처음 접했기 때문에 조잡함을 양해해 주시기 바랍니다. 저는 디렉토리가 포함된 모든 디렉토리를 순회 .git하고 작업 트리가 깨끗한지 더러운지 확인하는 간단한 스크립트를 작성하고 있습니다. 효과가있다,하지만나는 3개의 매개변수를 원한다:

  • rootDir: .git 디렉토리의 최상위 디렉토리를 검색합니다.
  • status: clean|dirty|all디렉터리 상태에 따라 출력을 필터링합니다.
  • \0구분 기호: 이 출력을 전달하고 추가로 명령을 실행할 수 있도록 구분 기호를 실행하기 위해 null 전달을 허용하며 xargs공백이 있는 경로도 지원합니다.

내가 직면한 문제는 매개변수를 fd execisRepoDirty함수로 전달하는 것입니다. 매개 $cleanOrDirty변수가 어떻게든 들어왔는데 매개 $separator변수가 작동하지 않습니다. 내 작은따옴표, 큰따옴표 지식은 여기에서 약간 불안정합니다. 매개변수를 작은따옴표 안에 넣으면 절대 확장되지 않습니다.

이것이 내가 가진 것입니다:

#!/bin/bash
# DOES NOT WORK IN ZSH!
# https://unix.stackexchange.com/questions/50692/executing-user-defined-function-in-a-find-exec-call

rootDir=$1
cleanOrDirty=$2
separator=$3

# echo "Root: $rootDir"
# echo "Clean or Dirty: $cleanOrDirty"
# echo "Separator: $separator"

function isRepoDirty() {
    if [[ $(git --git-dir "$1" --work-tree "$1/.." status --porcelain | wc -l) > 0 ]]; then
        status="dirty"
    else
        status="clean"
    fi

    # echo "Repo: $1, Status: $status"
    if [[ $2 == $status || $2 == "all" ]]; then
        # echo "Separator: $3"
        if [[ $3 == "null" ]]; then
            printf "%b" "$1/..\0"
        else
            echo "$1/.."
        fi
    fi
}
export -f isRepoDirty

fd --no-ignore --hidden -t d "\.git$" $rootDir -x /bin/bash -c 'isRepoDirty "{}" '$cleanOrDirty $separator

내 접근 방식이 완전히 잘못된 경우에는 모범 사례로 간주되는 일을 배우고 수행하는 데 매우 열정적이므로 알려 주시기 바랍니다. 하하, 제가 전달한 매개변수는 조금 초보적입니다. bash에서 -p매개변수를 쉽게 처리하고 스타일을 지정 하는 쉬운 방법을 찾지 못했습니다.--parameter-name

시간 내 주셔서 감사합니다!

답변1

비슷한 문제가 있었는데 bash다음과 같은 매개변수를 추가하여 문제를 해결했습니다.

bash -c 'command "$@"' bash arg1 arg2

Stéphane Chazelas가 지적했듯이 첫 번째 인수는 $0호출되는 명령 으로 처리되므로 _초기 디버깅보다 디버깅이 더 쉬워집니다.

귀하의 경우 대답은 다음과 같습니다.

fd --no-ignore --hidden -t d '\.git$' "$rootDir" -x /bin/bash -c 'isRepoDirty "$1" "$2" "$3"' bash {} "$cleanOrDirty" "$separator"

, $rootDir로 시작하지 않고 , , , , 를 포함 하지도 않는 것으로 가정합니다 .-$cleanOrDirty$separator;{}{/}{//}{.}{/.}

이러한 상황을 방지하려면 옵션 구분 기호를 사용하면 됩니다. 즉 --, 패턴 앞으로 이동한다는 의미 -x이며 인수 대신 환경을 통해 이러한 추가 변수의 내용을 전달할 수 있습니다.

(
  export cleanOrDirty separator
  exec fd --no-ignore --hidden -t d -x /bin/bash -c '
    isRepoDirty "$1" "$cleanOrDirty" "$separator"
    ' bash {} ';' -- '\.git$' "$rootDir"
)

관련 정보