Pipes vs atribuição variável

1

De que maneira os canais são diferentes das atribuições de variáveis?

Eu sei que você não pode usar bytes nulos . Que outros exemplos existem?

Que tal para a tubulação em algo como o seguinte yes | cat ? Eu percebo que gera o y enquanto atribuindo

test='yes'

não produz nada. Todo o comando é executado antes de canalizar os dados enquanto cat está sendo executado?

    
por William 18.11.2015 / 20:38

3 respostas

1
test='yes' 

tentará ler a saída completa de yes e atribuirá isso à variável test .

Como a saída de yes é infinita, essa atribuição invocará um loop infinito.

Sob o capô, ele usa o mecanismo do sistema operacional pipe , assim como a operação | .

test='yes'

é como

yes | thisShell.slurpInputAndSaveToVariable test

cat não tenta sugar toda a sua entrada, o que torna possível que yes e cat sejam executados simultaneamente como um produtor de streaming (e infinito neste caso) e um par de consumidores.

    
por 18.11.2015 / 22:09
1

Tubulação

yes é um comando que emite repetidamente uma string (o padrão é "y") até ser eliminado. Veja man yes

cat é um comando que envia para STDOUT tudo o que recebe em STDIN ou a concatenação de todos os arquivos listados como parâmetros. Veja man cat

O pipe ( | ) redireciona o STDOUT do comando anterior para o STDIN do próximo comando.

Portanto, canalizar para cat é um desperdício de ciclos de CPU.

Atribuição variável

A atribuição de variáveis permite que você armazene temporariamente uma string na memória.

Exemplo:

$ test="this is a string!"
$ echo $test
this is a string!

Se você quiser armazenar o resultado de um comando em uma variável, você precisará usar um subshell.

Exemplo:

$ echo "file contents :)" > test.file
$ test="$(cat test.file)"
$ echo $test
file contents :)

Referência

Para uso detalhado do bash, consulte o link

    
por 18.11.2015 / 21:32
1

Pipelines são muito o que o nome sugere: eles oferecem uma maneira de Transmitir dados de um membro do pipeline para o próximo. Manipulando fluxos de tamanho ilimitado é possível. Casos onde o processamento de um fluxo sem fim faz sentido incluir aqueles onde o progresso ou estatísticas sobre o conteúdos vistos até agora são impressos de tempos em tempos, e onde o usuário pode matar o oleoduto sempre que quiser.

Por outro lado, a construção de substituição de casca (backquotes ou $() ) não será concluído até a declaração anexada termina. Como a declaração no seu exemplo, yes , não terminar, nem $(yes) .

Eu diria que é uma maneira na qual a atribuição e a distribuição diferem Tremendo; não se pode realmente atribuir um valor de comprimento infinito a um variável, mas canalizar um é bom e funciona.

    
por 18.11.2015 / 22:00

Tags