Paramerete o número do descritor de arquivo para abrir um soquete tcp no shell script

4

Eu tentei parametrizar em uma variável o número do descritor de arquivo para abrir um soquete tcp usando o comando exec, mas ele falhou. Apenas funcione corretamente quando o número do descritor de arquivo for uma constante. No próximo exemplo de código somente sucesso a primeira tentativa (RC = 0).

Código:

echo -e "\nRetry 1: "
socket="/dev/tcp/$ip/$port"
exec 3<>$socket
echo "RC: $?"


echo -e "\nRetry 2: "
descriptor=3
socket="/dev/tcp/$ip/$port"
exec $descriptor<>$socket
echo "RC: $?"


echo -e "\nRetry 3: "
descriptor="3"
socket="/dev/tcp/$ip/$port"
exec $descriptor<>$socket
echo "RC: $?"

echo -e "\nRetry 4: "
descriptor=3
socket="/dev/tcp/$ip/$port"
exec "$descriptor"<>$socket
echo "RC: $?"

echo -e "\nRetry 5: "
descriptor=3
socket="/dev/tcp/$ip/$port"
'exec $descriptor<>$socket'
echo "RC: $?"

A saída é:

Retry 1:
RC: 0

Retry 5:
socket.sh: line 46: exec: 3: not found
RC: 127

ou, em outros casos:

Retry 1:
RC: 0

Retry X:
socket.sh: line 27: exec: 3: not found
    
por Jose D. Jurado 19.10.2012 / 14:40

1 resposta

3

É fácil entender por que ele falha quando você pensa em:

echo $text>some-file

Você não gostaria que se comportasse de maneira diferente se $text contivesse um número.

Você precisaria usar eval aqui:

eval 'exec '"$fd"'> "$file"'

(você deseja que $fd seja expandido nos argumentos para eval , mas não $file ).

Note que ksh93, zsh e bash introduziram (em abril de 2005, zsh 4.3.0, bash 4.1-alpha, ksh93r) a possibilidade de ter fds dinâmicos, como:

exec {fd}> "$file"

Aqui, o descritor de arquivo (um livre acima de 10) é escolhido pelo shell e armazenado na variável $fd .

Que você pode usar com ... >&$fd .

Ele combina mais de perto com o que você faz em outros idiomas: fd = open(...) , write(fd, ...) .

    
por 19.10.2012 / 15:17