심볼릭 링크를 무시하도록 Bash 4 'globstar' 옵션 강제 적용

심볼릭 링크를 무시하도록 Bash 4 'globstar' 옵션 강제 적용

**Bash 4에는 여러 디렉터리에 걸쳐 글로빙하기 위한 zsh의 구문을 에뮬레이션(즉, 훔치는) "globstar"라는 훌륭한 옵션이 있습니다 . 그러나 항상 심볼릭 링크를 따르기 때문에 (적어도 내 사용법에서는) 다소 손상됩니다.

**심볼릭 링크를 따라가는 것을 방지하는 방법이 있습니까 ? 그렇지 않다면 향후 버전에서 Bash에 이 기능을 추가할 계획이 있습니까? 그때까지(또는 그러한 계획이 없는 경우) 누구든지 적절한(그리고 편리한) 해결 방법을 제안할 수 있습니까?

zsh의 구현이 더 유연하고 이 문제가 없다는 것을 읽은 것 같습니다. 하지만 불행하게도 우리는 직장에서 많은 bash 스크립트를 소스로 사용하고 시간이 없거나 시간이 없기 때문에 zsh로 직접 전환할 수 없습니다. 모두 zsh로 변환하고 전문 지식을 최신 상태로 유지하세요. (Bash 하위 쉘을 시작하고 필요한 스크립트를 가져온 다음 변경된 모든 환경 변수, 별칭, 함수 등을 어떻게든 zsh로 백포트하는 것이 가능할 수도 있지만 그렇게 하는 방법도 모르겠습니다.)

나는 그것을 사용하여 find내가 원하는 방식으로 작동하는 함수를 작성한 다음 **함수에 별칭을 추가할 수 있다는 것을 알고 있지만 그런 작업을 수행할 수 없으며 내가 생각할 수 있는 가장 가까운 것은 다음 path/to/parent/**/child/paths과 같습니다. 상위 경로를 첫 번째 인수로 사용하고 이를 구성하고 실행하는 명령 에 대한 인수로 포함하는 함수의 별칭입니다 . 이건 부끄럽고 추악한 일이고 정말 더 나은 것을 원합니다. (특히 이 형식은 쉽게 변형을 허용 하고 쉽게 직관적인 반면, 함수는 이를 별도로 합계로 변환하는데 , 두 번째는 정말 나쁩니다.)$(** path/to/parent child/paths)**--wholename */child/paths/*findpath/**/pathpath/****/path** path/** '.' /path

어떤 아이디어가 있나요?

답변1

**이후부터는 심볼릭 링크를 더 이상 따르지 않습니다 bash-4.3.

바라보다다양성사이 bash-4.3-release:bash-4.3-rc2

globstar(**)는 더 이상 디렉터리로 확인되는 기호 링크를 통과하지 않습니다. 이렇게 하면 일부 중복 항목이 제거됩니다.

답변2

Bash에서는 심볼릭 링크를 방지할 방법이 없습니다 **.방법을 물어보세요어떤 반응이라도 만났습니다.

코드를 작성하려면 bash를 패치하여 심볼릭 링크 탐색을 끄는 새 옵션을 도입할 수 있습니다 **. bash 관리자에게 패치를 제출하면 언젠가 해당 기능이 나타날 가능성이 높아집니다. 그러나 적어도 그 동안에는 중요한 시스템 프로그램의 로컬 버전을 배포하고 유지 관리해야 하는데 이는 아마도 나쁜 생각일 것입니다.

**별칭의 동작을 변경할 수 있는 방법은 없습니다 . 확장 결과를 저장하기 위해 중간 배열을 사용하는 경우 다음 방법을 사용할 수 있습니다 find.

find . … -print0 | {
  a=()
  while read -r -d "" line; do 
    a+=("$line")
  done
  frobnicate "${a[@]}"
}

bash는 하위 프로세스에서 파이프의 오른쪽을 실행하므로 출력을 사용하는 프로그램의 전체 부분은 find파이프의 오른쪽에 있어야 합니다.

이름에 개행 문자가 포함된 파일을 제외할 수 있다면 더 쉬울 것입니다.

set -f; IFS=
a=($(find . … ! -name $'*\n*' -print))
set +f; unset IFS
frobnicate "${a[@]}"

zsh의 ksh 에뮬레이션 모드에서 기존 스크립트를 실행해 볼 수 있습니다. Zsh는 bash의 모든 기능을 구현하지 않습니다. 거의 모든 bash 기능이 zsh에 있지만 때로는 구문이 호환되지 않습니다. ksh93을 사용하여 스크립트를 실행할 수도 있습니다. 93o+로 시작하는 버전은 **zsh와 같이 지원되며 대부분(전부는 아님) bash 기능은 ksh에서 제공되므로 스크립트를 ksh93으로 쉽게 이식할 수 있습니다. ksh로 전환하면 bash나 zsh보다 속도가 더 빨라진다는 또 다른 이점이 있습니다.

답변3

더 쉬운 해결책을 찾았습니다. zsh를 사용하여 이러한 글로브를 평가하면 됩니다.

내 bash 구성 스크립트에는 다음이 있습니다.

function zeval () {
    echo $@ | zsh
}
alias z*='zeval echo'

이제 zsh를 사용할 때마다 /path/with/**/globbash에서 다음을 수행할 수 있습니다.

$(z* sandbox/rmall_gdsarc/**/*gds)

별칭이 확장되는 컨텍스트와 와일드카드가 필요한 컨텍스트는 일반적으로 겹치지 않으므로 별칭이 z*모호해서는 안 됩니다.

(별명과 Bash glob 구문 사이의 혼동에 대해 제가 생각할 수 있는 유일한 상황은 z*이미 경로에 있고 "z"로 시작하는 실행 가능한 스크립트가 포함된 디렉토리에 있고 glob을 사용하려는 경우입니다... 어쨌든 별 의미가 없습니다).

관련 정보