Combinando vários padrões em uma linha

3

Costumo usar um programa chamado tty0tty , que cria um modem nulo usando PTYs. Agora quero torná-lo parte de um processo automatizado.

Quando inicio tty0tty , imprime

(/dev/pts/1) <=> (/dev/pts/2)

Seria possível analisar a saída e usar as correspondências como parâmetros para outro programa? Para que as seguintes linhas possam ser automatizadas:

linux$ tty0tty &
(/dev/pts/X) <=> (/dev/pts/Y)
linux$ someprogram /dev/pts/X &
linux$ microcom /dev/pts/Y
    
por Kotte 08.07.2014 / 11:05

1 resposta

2

Você pode usar sed e substituição de processos :

read left right < <(tty0tty | head -n 1 | sed -e 's/[()<=>]//g' &)

Depois disso, $left é /dev/pts/X e right é /dev/pts/Y .

Isso engana um pouco - apenas substituímos os caracteres ( , ) , < , = e > com nada e, em seguida, confiamos na divisão da palavra da shell depois disso.

Enviamos a tty0tty output para head , então pegamos somente a primeira (única) linha de saída e não bloqueamos para sempre. A partir daí, ele vai para o comando sed que faz a substituição e, em seguida, usa o read bultin do shell para ligar as variáveis left e right do shell às primeiras e segundas palavras da entrada que fornecemos. Recebemos essa entrada do <(...) . <(...) runs ... em uma subshell e conecta sua saída a um pipe que podemos ler. Nós alimentamos esse pipe em read com o primeiro < , então ele obtém /dev/pts/X /dev/pts/Y e o divide nas duas palavras que queríamos.

Depois disso, você pode executar someprogram $left e microcom $right conforme desejado.

    
por 08.07.2014 / 11:18

Tags