와일드카드 확장 zsh

와일드카드 확장 zsh

qstat나는 실행 중인 작업의 ID를 제공하는 서버에서 실행 중입니다 (세부 사항은 중요하지 않음). 예를 들어, 123, 124, 125, 세 가지 작업을 실행하고 있다고 가정해 보겠습니다.

> qstat
123
124
125

각 작업에는 로그 파일이 있습니다 logs/. tail -F모든 작업에 대한 로그 파일을 원합니다 .

나는 전에 시도했다

tail -F $(qstat | awk -v P=logs '{ print P"/*"$1 }' | paste -sd " ")

하지만 난 이해해

tail: cannot open logs/*123 for reading: No such file or directory

모든 직업에 대해.


나는 달리고 zsh있는데 똑같은 일이 적용됩니다 bash!

분명히 $(...) 뒤에는 와일드카드 확장이 없습니다. 그럴 수 있습니까? 이 문제를 어떻게 해결할 수 있나요 zsh?

답변1

globsubst예, 명령 대체 시 파일 이름 확장 및 기타 확장은 일반적으로 필요하지 않으며, sh/ksh 에뮬레이션( 옵션) 을 제외하고 zsh에서는 파일 이름 확장이 기본적으로 수행되지 않습니다 .

globsusbt를 사용하여 특정 명령 대체를 요청할 수 있지만 ${~$(...)}(btw, 해당 부분은 필요하지 않으며 paste공백과 줄 바꿈이 기본값에 있음 $IFS) zsh를 사용하는 더 나은 접근 방식은 다음과 같습니다.

ids=($(qstat))
tail -F logs/*${^ids}

이러한 glob 중 어떤 파일과도 일치할 수 없는 경우 명령이 중단됩니다.

tail -F logs/*${^ids}(N)

( (N)활성화빈 공tail -F해당 전역 변수의 경우)는 이를 방지하지만 파일이 전혀 없으면 인수 없이 실행됩니다(참조nullglob이 기본값이 아닌 이유는 무엇입니까?).

다음을 수행할 수도 있습니다.

logs=(logs/*${^$(qstat)}(N))
(($#logs)) && tail -F $logs

1과 다른 Bourne 같은 쉘이 이런 일을 한다는 사실은 bash버그로 간주될 수 있습니다. 이것이 이유 중 하나입니다모든 변수를 인용해야합니다또는 분할 부분만 원할 때 분할+glob set -o noglob전에 인용 부호를 사용 하지 않는 이유가 무엇입니까? 예 를 들어 , $(...)더욱 현대적인 쉘에는 Bourne 쉘 수하물이 포함되어 있지 않습니다 .rcesfish

관련 정보