나는 bash 스크립팅을 처음 접했기 때문에 조잡함을 양해해 주시기 바랍니다. 저는 디렉토리가 포함된 모든 디렉토리를 순회 .git
하고 작업 트리가 깨끗한지 더러운지 확인하는 간단한 스크립트를 작성하고 있습니다. 효과가있다,하지만나는 3개의 매개변수를 원한다:
- rootDir: .git 디렉토리의 최상위 디렉토리를 검색합니다.
- status:
clean|dirty|all
디렉터리 상태에 따라 출력을 필터링합니다. \0
구분 기호: 이 출력을 전달하고 추가로 명령을 실행할 수 있도록 구분 기호를 실행하기 위해 null 전달을 허용하며xargs
공백이 있는 경로도 지원합니다.
내가 직면한 문제는 매개변수를 fd
exec
내 isRepoDirty
함수로 전달하는 것입니다. 매개 $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"
)