zsh의 IFS에서 에코를 적용해야 하는 이유는 무엇입니까?

zsh의 IFS에서 에코를 적용해야 하는 이유는 무엇입니까?

PATHzsh 5.8을 사용하여 배열의 멤버를 배열로 읽으려고 합니다 . 저는 Bash를 사용하는 데 익숙하며 일반적으로 다음을 수행할 수 있습니다.

IFS=: p=($PATH)

그러나 zsh를 사용하면 실제로 항목이 하나만 있는 배열이 제공됩니다. 다시 작성하면:

IFS=: p=($(echo $PATH))

그런 다음 올바른 수의 요소를 얻습니다. 왜 그런 겁니까?

답변1

zsh는 POSIXy 쉘과 달리 기본적으로 매개변수 확장을 토큰화하지 않기 때문입니다. 명령 대체와 함께 작동하므로 왕복을 통해 이를 "수정"할 수 있습니다. 그러나 이는 여전히 zsh에서 수행하는 올바른 작업과는 거리가 멀고 echo명령 대체의 조합으로 인해 경우에 따라 데이터가 손상될 수도 있습니다.

zsh에서는 $=PATH토큰화를 요청하거나 여기에 제공된 보다 적절한 솔루션을 사용할 수 있습니다.bash/zsh에서 ':' 문자를 사용하여 문자열을 분할하는 방법은 무엇입니까?

또한 의 경우 PATH기본적으로 zsh의 배열 변수에 바인딩되어 있으므로 path배열로 액세스하기 위해 아무것도 할 필요가 없습니다.


IFS=: p=($PATH)( 따옴표가 없는 확장은 파일 이름 생성이나 와일드카드의 영향도 받으므로 의 경로에 PATH와일드카드( 및 기타 문자)가 포함된 경우 *?[]결과가 원하는 결과가 아닐 수 있습니다. 명령 대체를 통해 수행하고 왕복을 통해 echo모든 항목을 제거합니다. 후행 개행 및 (에 따라 echo) 백슬래시를 깨뜨릴 수도 있습니다.

관련 정보