zsh 함수 매개변수에 큰따옴표를 추가하는 방법은 무엇입니까?

zsh 함수 매개변수에 큰따옴표를 추가하는 방법은 무엇입니까?

.zshrc에 다음과 같이 정의된 함수가 있습니다.

fdtnxg () {
    find $1 -type $2 -name "$3" | xargs grep "${@:4}"
}

현재 디렉토리에서 이름이 fdtnxg.alias mottt.fdtnxg . f "tt.*" "alias mot"

fdtnxg . f tt.* alias mot직접 사용 하고 싶은데 사용할 수 없습니다. 예상대로 작동하도록 하는 방법이 있나요?

내가 바꾸려고 하는 것은 fdtnxg다음과 같습니다.

fdtnxg () {
    find $1 -type $2 -name "\"$3\"" | xargs grep "${@:4}"
}

echo "\"123\""견적을 받았기 때문에 이것을 시도했습니다 "123".

답변1

여기에 두 가지 질문이 있다고 생각합니다.

첫째, 함수를 실행할 때 셸이 와일드카드를 사용하지 못하도록 하려고 합니다. 실행하기 전에 파일 이름이 함수의 인수로 확장되므로 함수 내부에 따옴표를 추가하여 이 작업을 수행할 수 없습니다. 파일 이름 확장을 방지하려면 alias()를 사용하여 자동화 noglob fdtnxg할 수 있는 이 함수를 실행하십시오 alias fdtnxg="noglob fdtnxg".

2. Grep 매개변수. 네 번째부터 시작하는 함수 인수가 grep의 단일 문자열에 연결되기를 원한다고 가정합니다. "${@:4}", 다른 단어로 확장합니다( "$@"모든 위치 매개변수와 마찬가지로). "$*"대신 매개변수를 단일 문자열로 연결하세요. Zsh에서는 "${*[4,-1]}"네 번째 이후의 매개변수를 연결하는 것이 가능한 것 같습니다. ( "${*:4}"모두 연결하고 네 번째부터 시작하세요.특징, 이는 Bash가 수행하는 것과 다릅니다. ) 그래도 작동하지 않으면 언제든지 처음 세 개를 밖으로 이동하고 를 사용할 수 있습니다 "$*".

그래서 어느 쪽이든

fdtnxg () {
    find "$1" -type "$2" -name "$3" -exec \
      grep -- "${*[4,-1]}" /dev/null {} +
}

또는

fdtnxg () {
    local dir=$1
    local type=$2
    local name=$3
    shift 3
    find "$dir" -type "$type" -name "$name" -exec \
      grep -- "$*" /dev/null {} +
}

그리고

alias fdtnxg="noglob fdtnxg"

find어쨌든 출력을 그렇게 파이프 로 연결할 수는 없습니다 xargs. -print0/ GNU 확장자가 필요합니다 -0. 아니면 여기서는 표준 -exec cmd {} +찾기 구문을 사용하는 것이 더 좋습니다( 파일이 하나만 발견되더라도 파일 이름이 항상 인쇄되도록 /dev/null매개변수 를 추가합니다. GNU에서는 해당 옵션도 사용할 수 있습니다).grepfindgrep-H

관련 정보