Substituição de processo com redirecionamento de entrada

7

Estou tentando entender o redirecionamento de entrada em combinação com a substituição do processo. Estou usando bash 3

Um exemplo com tr é o seguinte

$ tr "o" "a" <(echo "Foo")
tr: extra operand '/dev/fd/63'
Try 'tr --help' for more information.

Acho que entendo por que isso não funciona. A substituição do processo <( ) cria um descritor de arquivo, em que tr apenas lê a entrada padrão.

Como posso fazê-lo funcionar com o redirecionamento adequado?

Eu sei que posso simplesmente usar pipes:

$ echo "Foo" | tr "o" "a"
Faa

No entanto, estou tentando entender melhor. Eu tentei alguma coisa com a ajuda de man bash , usando <& , mas eu realmente não sei o que estou fazendo.

Como posso usar a substituição de processos corretamente usando tr ?

    
por Bernhard 02.09.2014 / 12:43

2 respostas

10

Você estava muito perto:

tr "o" "a" < <(echo "Foo")

A substituição <() faz um descritor de arquivo e apenas cola o caminho para o shell. Para compreensão basta executar:

<(echo blubb)

Você verá o erro:

-bash: /dev/fd/63: Permission denied

É por isso que apenas cola /dev/fd/63 no shell e /dev/fd/63 não é exequível, porque é um simples pipe. No tr -exemplo acima, é echo "Foo" que grava no pipe e através do redirecionamento de entrada < é o comando tr que lê o descritor de arquivo.

    
por 02.09.2014 / 12:58
3

Eu encontrei o Explicação de uma linha de Bash série muito útil para entender mais sobre tudo isso.

Especificamente, o artigo relacionado acima é sobre redirecionamento de entrada.

Para resolver o exemplo específico acima:

> tr "o" "a" <<< $(echo "Foo")
Faa
    
por 02.09.2014 / 12:55