exec com uma variável filedescriptor

2

Por que isso não é possível e qual é a melhor maneira de contornar isso:

#!/bin/sh
desc=5; file=/etc/passwd
exec "$desc"<"$file" #the variable filedescriptor is the problem

Eu prefiro não eval .

    
por PSkocik 22.06.2017 / 10:48

1 resposta

3

Bem, por que isso não é possível, você não gostaria:

echo "$x">file

Para parar de funcionar se $x for um número.

Você precisa fazer:

eval 'exec '"$desc"'< "$file"'

Para o shell avaliar o código exec 5< "$file" . eval é OK, desde que você tenha cuidado para expandir apenas os itens que precisam ser expandidos (e que essas expansões são seguras) em seus argumentos (aqui usando aspas strongs para tudo, menos $desc ). O que seria errado seria algo como eval "exec $desc< $file" onde o conteúdo de $file é dado para o shell avaliar como código shell.

Com zsh , você também pode usar o sysopen incorporado no módulo zsh/system :

zmodload zsh/system
sysopen -u "$desc" -r -- "$file"

Em: zsh , bash e ksh93

exec {desc}>&-

trabalharia em fechar o fd armazenado em $desc , mas em

exec {desc}> file

O shell aloca um fd acima de 10 e atribui a $desc . Isso não pode ser usado para abrir file no fd que foi armazenado em $desc de antemão.

Observe que exec >&"$desc" funciona porque não há ambiguidade ... exceto em zsh e versões recentes de bash que têm um operador >& para redirecionar stdout e stderr para um arquivo (como em csh ), e onde echo something >& "$file" funciona apenas enquanto $file não é numérico.

    
por 22.06.2017 / 10:55

Tags