piping comandos não funcionando como esperado Eu preciso de explicação

0

Estou tentando fazer o seguinte

touch ~/scratches/scr6.txt | cat ~/scr.txt > ~/scratches/scr6.txt | cat /dev/null > ~/scr.txt

Eu não sei porque scr6.txt está sempre vazio, no entanto, fazer o seguinte preencher o arquivo

cat ~/scr.txt > ~/scratches/scr6.txt

Eu me pergunto por que o primeiro caso não está funcionando?

    
por xiarnousx 04.08.2015 / 22:11

4 respostas

1

Quebrando cada uma das etapas:

  • touch ~/scratches/scr6.txt

    Se o arquivo existir, atualiza o registro de data e hora para agora. Se não existe, cria-o.

  • cat ~/scr.txt > ~/scratches/scr6.txt

    Lê ~ / scr.txt e grava o conteúdo em ~ scratches / scr6.txt

  • cat /dev/null > ~/scr.txt

    Esvazia o arquivo ~ / scr.txt

Como mencionado nos comentários, usando "& &" (AND) entre os comandos em vez de "|" (PIPE) seria mais apropriado.

    
por 04.08.2015 / 22:22
2

Ok, considerando que o arquivo scr.txt contém algum texto antes de executar o comando e scr6.txt ainda não existe: o comando

touch ~/scratches/scr6.txt | cat ~/scr.txt > ~/scratches/scr6.txt | cat /dev/null > ~/scr.txt
  1. Vazio do arquivo scr.txt ( cat /dev/null > ~/scr.txt )
  2. Substitui scr6.txt por contetns de scr.txt (nada) ( cat ~/scr.txt > ~/scratches/scr6.txt )
  3. Não faz nada porque scr6.txt já existe ( touch ~/scratches/scr6.txt )

Mas o seguinte comando

cat ~/scr.txt > ~/scratches/scr6.txt

Escreve apenas scr.txt contents para scr6.txt

É por isso que ambos os arquivos estão vazios no primeiro caso e tudo funciona como esperado no segundo caso.

    
por 04.08.2015 / 22:53
0

Pelo que entendi, todos os processos canalizados iniciam mais ou menos ao mesmo tempo. Geralmente, os processos em um pipeline irão ler de stdin ou gravar em stdout (ou ambos), e a conclusão da E / S irá ditar quando o processo terminar.

Para processos que não têm saída (como touch ) ou qualquer entrada padrão (como cat ao operar em um arquivo), eu geralmente esperaria que suas conexões de pipe fossem ignoradas pelo programa.

Então, basicamente, você teria três comandos sendo executados em paralelo:

touch ~/scratches/scr6.txt , %código%, e cat ~/scr.txt > ~/scratches/scr6.txt .

É provavelmente dependente do sistema operacional se o comando 2 falharia com um erro se ~ / scr.txt ainda não existir, já que estaria em uma condição de corrida com o comando 3. Os comandos 1 e 2 também estão em uma condição de corrida. , mas a corrida só iria acabar afetando o ctime / mtime / atime do arquivo.

    
por 05.08.2015 / 07:47
-1

Em palavras simples:

O comando touch é o caminho para criar novos arquivos vazios . Ele também é usado para alterar os registros de data e hora (ou seja, datas e horas do acesso e modificação mais recentes) em arquivos e diretórios existentes.

No primeiro comando, cria um arquivo vazio chamado scr6.txt .

Mas no segundo comando, ele cria um arquivo scr6.txt e grava todo o conteúdo de scr.txt neste arquivo.

    
por 04.08.2015 / 22:22

Tags