Redirecionamento de E / S no OS X Lion

3

Eu tenho um script que costumava funcionar, que depende do envio de comandos (nomes de arquivos a serem processados de fato) para um processo de escuta em uma porta, usando TCP. Então eu posso ligá-lo e dizer para ouvir, diga a porta 9999.

Como um hack rápido, eu configuraria um redirecionamento de fluxo para a porta 9999 usando um comando como:

exec 3<> /dev/tcp/127.0.0.1/9999

e, em seguida, eu poderia executar um comando de localização no diretório que queria processar em lote todos os meus arquivos, como

find . -name "*.xml" -exec printf "$PWD/{} $PWD/{}\r\n" >&3 \;

Eu não tinha tentado isso desde que fiz o upgrade para o Lion, mas agora não funciona, me dando uma resposta de "Bad File Descriptor". Alguém tem alguma ideia?

    
por hcayless 30.09.2011 / 23:14

1 resposta

7

Redirecionamento para / dev / tcp e / dev / udp pseudo-arquivos é um recurso de tempo de compilação opcional do Bash que muitos fornecedores de SO estão optando por deixar desligado. Parece que a Apple se juntou ao clube. Você tem algumas opções:

  1. Use o recurso de substituição de processo do Bash da seguinte forma: exec 3> >(nc localhost 9999)

    Se você estiver fazendo isso interativamente, provavelmente desejará fazer isso depois que não quiser mais redirecionar para um soquete TCP: exec 3> /dev/null

    Isso deve fazer com que o processo nc gerado saia.

  2. Compile seu próprio bash com o suporte a / dev / tcp e / dev / udp do pseudo-arquivo ativado e use-o.

  3. Modifique seu script para enviar diretamente para o comando nc . Isso pode ser um problema se o script redireciona a saída para o filehandle 3 várias vezes e o processo de escuta não lida adequadamente com várias tentativas de conexão. No entanto, também é mais portátil se você precisar usar seu script em um sistema que não forneça o shell Bash.

por 01.10.2011 / 00:48

Tags