zsh에서 동적으로 할당된 파일 설명자의 bash 파괴를 시뮬레이션합니다.

zsh에서 동적으로 할당된 파일 설명자의 bash 파괴를 시뮬레이션합니다.

이 문서에 설명된 대로 스크립트에서 동적으로 할당된 파일 설명자를 사용합니다.

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

zshbash에뮬레이션 모드 가 없습니다 . 만약 당신이 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_REMATCHbash

{fd}<기능은 실제로 에서 나왔습니다 . 에서 zsh동시에 구현되었으며 3 개 쉘 모두의 관리자 간의 논의에서 zsh 개발자의 제안을 기반으로 구현되었습니다.zshksh93bash

echo {fd}< /dev/nullPOSIX에는 출력이 필요합니다 {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 emulateinfo zshI색인을 누른 다음 Enter를 누르세요 emulate(탭 완성 기능을 사용할 수 있습니다). 일부 시스템에서는 zsh-doc정보 문서가 기본적으로 항상 설치되는 것은 아니기 때문에 패키지나 이에 상응하는 패키지를 설치해야 할 수도 있습니다 .

관련 정보