bash **는 zsh **와 다릅니다. bash의 동작을 변경할 수 있습니까?

bash **는 zsh **와 다릅니다. bash의 동작을 변경할 수 있습니까?

이 파일 트리가 있습니다.

a.py
b/c.py

Bash에서는 ls -l **/*.py주어진

b/c.py

Zsh에서는 ls -l **/*.py좋은

a.py
b/c.py

이를 방지하기 위해 bash 동작을 변경할 수 있는 방법이 있습니까 ls *.py **/*.py?

추신: 사용했지만 ls문제는 모든 명령에 있습니다.

답변1

일반 sh 및 일반 sh 이전 버전과 호환되는 쉘에서 모드 ***는 동일합니다. Zsh는 여러 가지 방법으로 sh 호환성에서 벗어납니다. 그 중 하나는 모드 **/***/작업 입니다.재귀 와일드카드. **/…현재 디렉터리, 해당 하위 디렉터리, 하위 하위 디렉터리 등을 검색할 ***/…뿐만 아니라 하위 디렉터리에 대한 기호 링크도 통과합니다.

Bash ≥4.3에서 유사한 기능을 활성화할 수 있습니다.shopt -s globstar, ksh93에서 set -o globstar/ 와 함께 set -G. 기타 관련 옵션은 다음과 같습니다.

  • shopt -s dotglob와일드카드 패턴이 도트 파일과 일치하도록 만듭니다( zsh 의 set -o dotglob/ 와 유사 globdots).
    • GLOBIGNORE변수를 설정하면 bash이 옵션도 자동으로 활성화됩니다.
    • ksh93을 사용하면 비슷한 효과를 얻을 수 있습니다 FIGNORE=.:...
    • zsh에서는 (D)사례별로 패턴에 따라 glob 한정자를 사용하여 이 작업을 수행할 수도 있습니다. Bash/ksh93에는 유사한 기능이 없습니다.
  • shopt -s extglobksh88 스타일 확장 glob 연산자( set -o kshglobzsh와 유사)를 활성화합니다(ksh에서는 항상 활성화됨).
    • zsh는 또한 set -o extendedglob다른 구문으로 임의의 정규식(부정 연산자 사용)을 표현하는 대체 방법을 제공합니다. Bash에는 이 구문에 해당하는 구문이 없습니다.
  • shopt -s nocaseglobset -o nocaseglob패턴 일치를 대소문자를 구분하지 않게 만듭니다( zsh 의 / 와 유사 set +o caseglob).
    • zsh에서는 패턴 접두어를 붙여 사례별로 수행할 수 있습니다 (#i). 마찬가지로 ksh93에서는 패턴 접두어를 붙일 수 있습니다 ~(i). Bash에는 유사한 기능이 없습니다.
  • shopt -s nullglob일치하는 파일이 없으면 패턴을 변경하지 않고 그대로 두는 대신 glob 패턴이 빈 목록으로 확장됩니다( set -o nullglobzsh와 유사).
    • zsh에서는 (N)패턴에 따라 glob 한정자를 사용하여 사례별로 이를 수행할 수 있습니다. ksh93에서는 ~(N)모드가 앞에 옵니다. Bash에는 유사한 기능이 없습니다.
  • shopt -s failglob패턴을 변경하지 않고 그대로 두는 대신 일치하는 파일이 없으면 오류를 트리거합니다(zsh의 기본 동작).
  • set -o globstarshort예를 들어, .in 과 유사 하지만 ( 확장자에 포함된 것을 제외하고) 동일 하게 zsh작성할 수도 있습니다 .****/***/*.py**.pybash -O globstar****/*dir/**dir/**.py*.py

Bash 4.0에서는 이 globstar옵션과 **모드를 도입했지만, bash 4.3 이전에는 항상 디렉터리의 심볼릭 링크를 순회했지만 5.0 이전에는 디렉터리의 심볼릭 링크를 순회했습니다.일부심볼릭 링크. Bash 3.x 이하에는 그러한 기능이 없습니다.

tcsh유사한 형태의 재귀 와일드카드를 , yash및 셸 에서도 사용할 수 있습니다 fish(기본적으로 활성화되어 있지 않음).


.¹ 이러한 쉘 과 ..특수 디렉토리 사이에는 약간의 차이점이 있다는 점에 유의하십시오 . 이들은 zshglob에 의해 확장되지 않으며 설정은 ksh93 의 glob에서 제외되지만 bash에서는 Even with FIGNORE=.:..와 같이 glob에서 제외되지만 . 설정은 도움이 되지만 그렇지 않습니다 .*dotglob.*GLOBIGNORE=.:...*dir/.*.*/file

관련 정보