Mover descritores de arquivos em zsh

3

A construção ls 3>&2 2>&1 1>&3- em zsh não se comporta de maneira consistente com ksh / bash ou com shells mais limitados como dash que não suportam nenhum descritor de arquivo em movimento. Em vez de emitir o conteúdo do diretório no erro padrão ou reclamar de um número de descritor de arquivo inválido, ele não imprime nada. O que mover um descritor de arquivo significa / faça em zsh ? Eu testei apenas as várias shells no OS X até agora (usando a versão mais recente instalada pelo homebrew).

Primeiro, configuramos uma pasta temporária

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch a
$ touch b

Em seguida, executamos ls 3>&2 2>&1 1>&3- com bash e ksh , que suportam descritores de arquivos em movimento.

$ bash -c 'ls 3>&2 2>&1 1>&3-'
a       b

$ bash --version | head -n 1
GNU bash, version 4.4.5(1)-release (x86_64-apple-darwin15.6.0)

ksh se comporta de maneira semelhante

$ ksh -c 'ls 3>&2 2>&1 1>&3-'
a       b

$ ksh --version
version         sh (AT&T Research) 93u+ 2012-08-01

dash é um exemplo de um shell que não suporta esta sintaxe. Ele interpreta 1>&3- como uma duplicação mal formatada.

$ dash -c 'ls 3>&2 2>&1 1>&3-'

traço: 1: Erro de sintaxe: número fd incorreto

zsh , bizarramente, não imprime nada.

$ echo -n '<'; zsh -c 'ls 3>&2 2>&1 1>&3-'; echo '>'
<>

$  zsh --version
zsh 5.2 (x86_64-apple-darwin15.4.0)

zsh está executando os dups subjacentes e fecha em uma ordem diferente de bash e ksh ? Tem um bug na sua implementação deste recurso?

    
por Gregory Nisbet 12.12.2016 / 02:26

1 resposta

4

zsh não suporta a sintaxe do descritor de arquivo em movimento como bash ou ksh . Portanto, 1>&3- significa redirecionar a saída padrão e o erro padrão para o arquivo denominado 3- :

$ echo -n '<'; zsh -c 'ls 3>&2 2>&1 1>&3-'; echo '>'
<>
$ ls
3- a b

Para obter o mesmo comportamento de descritor de arquivo em movimento, como bash e ksh , em qualquer shell POSIX:

sh -c 'ls 3>&2 2>&1 3>&1 3>&-'

Isso é o que o 1>&3- em bash e ksh faz internamente, o descritor de arquivo duplicado 3 para o descritor de arquivo 1 e, em seguida, fecha o descritor de arquivo 3.

    
por 12.12.2016 / 04:28