이 문서에 설명된 대로 스크립트에서 동적으로 할당된 파일 설명자를 사용합니다.
bash의 `{var}>&1`에 해당하는 zsh 및 POSIX
스크립트 자체는 bash와 zsh 간에 이식 가능하므로 emulate -LR bash
스크립트가 zsh에서 실행 중임을 감지하면 가능한 한 빨리 실행됩니다.
불행하게도 이로 인해 exec {fd}>&...
zsh와 bash가 꽤 오랫동안 지원해 왔던 기능이 중단됩니다.
설명하자면 이 스크립트는 성공합니다(bash에서도 작동함).
#!/usr/bin/env zsh
set -euo pipefail
for i in {1..10}; do
exec {fd}> >( tee /dev/stderr | logger )
echo "FD: ${fd}" >&"${fd}"
done
하지만 다음은 그렇지 않습니다.
#!/usr/bin/env zsh
set -euo pipefail
emulate -LR bash
for i in {1..10}; do
exec {fd}> >( tee /dev/stderr | logger )
echo "FD: ${fd}" >&"${fd}"
done
command not found: {fd}
누구든지 그것이 뒤에서 수행하는 작업의 전체 목록을 알려줄 수 있습니까? emulate -R bash
(어쩌면 내가 간과하고 있지만 실제 매뉴얼 페이지를 찾을 수 없습니다 emulate
). 또는 어떤 특정 옵션이 이 문제를 일으키는지 아는 사람이 있다면 더 좋을 것입니다.
도움을 주셔서 미리 감사드립니다.
답변1
zsh
bash
에뮬레이션 모드 가 없습니다 . 만약 당신이 bash
(또는 s
또는로 시작하는 모든 것 b
) (for번)) ~ 에뮬레이션 모드를 emulate
사용합니다 .sh
$ emulate bash -c emulate
sh
zsh
에뮬레이션 모드는 zsh
(기본값), sh
(원래는 주로 SysV/Bourne sh
, 현재는 POSIX sh
) csh
및 입니다 ksh
.
bash
은(는) 주로 POSIX 호환 셸이지만 sh
해당 확장은 대부분 Korn 셸에서 제공되므로 POSIX가 아닌 확장을 사용하는 코드를 zsh
해석 하려면 가장 좋은 옵션은 ksh 에뮬레이션입니다(호환성을 위해 예상되는 옵션을 bash
활성화할 수도 있습니다 ).BASH_REMATCH
bash
이 {fd}<
기능은 실제로 에서 나왔습니다 . 에서 zsh
동시에 구현되었으며 3 개 쉘 모두의 관리자 간의 논의에서 zsh 개발자의 제안을 기반으로 구현되었습니다.zsh
ksh93
bash
echo {fd}< /dev/null
POSIX에는 출력이 필요합니다 {fd}
(비록이는 표준의 향후 버전에서 변경될 예정입니다.)이므로 시뮬레이션 zsh
에서는 비활성화하세요 sh
. 시뮬레이션에는 없으므로 ksh
여기서 사용해야 합니다.
<C>
에뮬레이션(zsh, sh, ksh, csh)에서 어떤 옵션이 활성화되어 있는지는 설명서 의 각 옵션 설명 옆에 있는 , , , ( )를 참조하세요 <K>
.<S>
<Z>
info zsh 'Description of Options'
기능 에 영향을 미치는 옵션은 {fd}>...
설명서의 기능 설명( )에 지정되어 있습니다 info zsh 'file descriptors, use with parameters'
. IGNORE_BRACES
설명( ) 옆에 시뮬레이션에서 기본적으로 info zsh IGNORE_BRACES
만 활성화되어 있음을 나타내는 표시 가 있습니다.<S>
sh
매뉴얼 페이지(그 중 일부)가 포함되어 있지만 zsh
이렇게 큰 매뉴얼에는 상당히 부적합합니다. 나는 info
하이퍼텍스트를 사용하고 검색 가능한 색인과 목차를 갖는 것을 권장합니다. zsh
무엇이 내장되어 있는지 알아보려면 를 실행하거나 press 내에서 emulate
실행할 수 있습니다 .info zsh emulate
info zsh
I색인을 누른 다음 Enter를 누르세요 emulate
(탭 완성 기능을 사용할 수 있습니다). 일부 시스템에서는 zsh-doc
정보 문서가 기본적으로 항상 설치되는 것은 아니기 때문에 패키지나 이에 상응하는 패키지를 설치해야 할 수도 있습니다 .