linux - Shell esquisitices redirecionamento de entrada scripting - CoreDump.pt
Shell esquisitices redirecionamento de entrada scripting
Alguém pode explicar esse comportamento? Corrida:
resulta em nada sendo ouput, enquanto:
produz a saída esperada:
o tubo não deve fazer em um passo que o redirecionamento para test.file fez no segundo exemplo? Tentei o mesmo código com ambas as conchas de traço e bash e tem o mesmo comportamento de ambos.
Publicado 05/08/2008 em 20:26 2008-08-05 20:26
não produz nenhuma saída porque condutas executar cada um dos seus componentes dentro de uma subcamada. Subshells herdam cópias de variáveis do shell pai, em vez de compartilhá-los. Tente isto:
Os parênteses definem uma região de código que é executado em um subnível, e US $ foo mantém o seu valor original depois de ser modificado dentro deles.
As chaves são puramente para agrupamento, não subshell é criado, e os US $ foo modificado dentro das chaves é o mesmo $ foo modificado fora deles.
Dentro das chaves, a leitura embutido cria $ var1 e $ var2 corretamente e você pode ver que eles se repetiu. Fora as chaves, eles não existem mais. Todo o código dentro das chaves foi executado em um subshell porque é um componente de um gasoduto .
Você pode colocar valores arbitrários de código entre chaves, assim você pode usar esta construção tubulação-em-a-bloco sempre que você precisa para executar um bloco de script que analisa a saída de outra coisa.
Respondeu 19/09/2008 em 03:20 2008-09-19 03:20 share
fonte usuário flabdablet
Isso já foi respondida corretamente, mas a solução ainda não foi declarado. Use ksh, não bater. Comparar:
ksh é um shell de programação superior, pois de pequenas sutilezas como este. (Bash é o shell melhor interativa, na minha opinião.)
Respondeu 15/08/2008 em 16:52 2008-08-15 16:52 share
Uma recente adição bashé a lastpipeopção, que permite que o último comando em um pipeline para executar no shell atual, não um subnível, quando o controle do trabalho é desativado.
vai realmente de saída
Respondeu 26/07/2012 em 13:10 2012-07-26 13:10 share
fonte usuário chepner
Respondeu 17/09/2008 em 01:17 2008-09-17 01:17 share
fonte usuário Steve Baker
Allright, eu descobri-lo!
Este é um bug difícil de pegar, mas os resultados da forma como tubos são manipulados pelo shell. Cada elemento de um gasoduto é executado em um processo separado. Quando os conjuntos de comandos de leitura var1 e var2, é define-lhes que o seu próprio subnível, não o shell pai. Então, quando as saídas subshell, os valores de var1 e var2 são perdidas. Você pode, no entanto, tentar fazer
que retorna a resposta esperada. Infelizmente isso só funciona para variáveis ​​individuais, você não pode definir muitos de cada vez. A fim de definir múltiplas variáveis ​​em um momento você deve ler em uma variável e pique-o em múltiplas variáveis ​​ou usar algo como isto:
Enquanto eu admito que não é tão elegante como a utilização de um tubo, ele funciona. Claro que você deve ter em mente que ler era para ler a partir de arquivos em variáveis, assim tornando-se ler da entrada padrão deve ser um pouco mais difícil.
Minha opinião sobre esta questão (usando Bash):
Respondeu 04/03/2009 em 10:52 2009-03-04 10:52 share
O post foi respondida corretamente, mas eu gostaria de oferecer um um forro alternativa que talvez pudesse ser de alguma utilidade.
Para atribuir valores separados de espaço de echo (ou saída padrão para essa matéria) que desembolsar variáveis, você poderia considerar o uso de matrizes de shell:
Dessa forma, você pode ter tantos parâmetros como você deseja atribuir o índice da matriz relevante.
Respondeu 14/09/2008 em 18:00 2008-09-14 18:00 share
fonte usuário Dimitris Liappis
É porque a versão tubo é a criação de um subnível, que lê a variável em seu espaço local, que, em seguida, é destruído quando as saídas subshell.
Executar este comando
e usar pstree -p olhar para os processos em execução, você verá uma shell adicional pendurado de seu escudo principal.
Respondeu 05/08/2008 em 21:00 2008-08-05 21:00 share
O problema, como várias pessoas afirmaram, é que var1 e var2 são criados em um ambiente subshell que é destruída quando essa saídas subshell. Os evita acima destruindo a subcamada até que o resultado tenha sido echo'd. Outra solução é: