Eu tentei rev
um arquivo e depois o canalizei, cat > same_file
mas estava se transformando em um arquivo em branco.
Enquanto eu tentei rev file.txt | cat > file2.txt && mv file.txt file2.txt;
, funcionou.
Até rev file.txt | cat >> file.txt;
funcionou.
Mas quando eu tentei rev file.txt | cat > file.txt
, falhou.
command-line
redirect
Vintux
fonte
fonte
cat
fora como este:rev file.txt > file2.txt && mv file2.txt file.txt
. Este é um uso supérfluo decat
. Ao deixá-lo de fora, você poupa a geração de um processo extra.Respostas:
O básico que você precisa entender nesse caso entre as duas maneiras de redirecionar (> e >>) é:
>
Redireciona e substitui as informações para as quais elas foram apontadas. Isso acontece ao receber qualquer informação através do canal "|"
>>
Redireciona e concatena as informações para as quais foi apontada. Isso acontece ao receber qualquer informação através do canal "|"
Nos dois casos, se o arquivo não existir, ele será criado. Somente em ">>" as informações serão concatenadas se você executá-las novamente no mesmo arquivo. Com ">" você simplesmente substituiria tudo o que fez na primeira execução.
Mas aqui está o problema ao usar o mesmo arquivo de entrada que o arquivo de saída. Nesse caso específico, se você usar ">", removeria as informações que a parte "entrada" precisa analisar, uma vez que o arquivo de saída estaria "substituindo-o". Então em:
O que realmente está acontecendo na "explicação em câmera lenta" é:
rev
se prepara para reverter o conteúdofile.txt
e enviá-lo para o canalrev
está enviando as informações para o pipe, ele o envia diretamente paracat
.cat
estiver recebendo as informações, ela será aplicada automaticamente aofile.txt
que foi definido.cat
não esperará pararev
canalizar o arquivo inteiro. Ele simplesmente começará no minuto em que a primeira parte da informação chegar, o que significa que, dependendo de qual símbolo você usou, ela abrirá uma conexãofile.txt
.file.txt
enquanto aguarda a chegada das novas informações. Com >>, ele abriria uma conexãofile.txt
e aguardaria novas informações na última linha detectada.file.txt
com > ,rev
tentaria fazer seu trabalho e não obteria nada porquecat
excluía tudo em preparação para a nova informação.Então, por que os outros trabalham depois de ler o acima? Por causa disso:
Aqui você está direcionando para o gato que está enviando as informações para outro arquivo. Nesse caso, o arquivo de entrada processado
file.txt
não é o mesmo que o arquivo de saídafile2.txt
. Depois que você está literalmente substituindo o todofile2.txt
comfile.txt
, por isso, todo o processo feito pelocat
foi excluída. Basicamente, toda a linha poderia ser simplificada,cp file.txt file2.txt
porque ela está fazendo a mesma coisa, poisfile2.txt
no final perderev
omv
comando e é sobrescrita .Nesse caso, você está concatenando as informações para o mesmo arquivo. Portanto, ele está apenas abrindo uma conexão com esse arquivo, mas não apagando as informações como vistas com um único > . O resultado final deve ser a informação original mais a informação invertida.
fonte
rev file.txt | cat --bogus-option > file.txt
também truncará o arquivo, mesmo que o gato não tente abri-lo.moreutils
) que incluisponge
uma ferramenta projetada especificamente para a maneira de substituir um arquivo de entrada. Por exemplo, arev file.txt >file2.txt && mv file2.txt file.txt
solução alternativa se tornariarev file.txt | sponge file.txt
, o que funcionará corretamente mesmo quando já houver algo nomeadofile2.txt
.Quando o shell vê o redirecionamento, ele abre os arquivos relevantes primeiro, antes de executar qualquer um dos comandos envolvidos. Assim, quando você faz:
O redirecionamento para
file.txt
faz com que seja truncado antes defoo
ser executado e pode ser lidofile.txt
. Em uma nota lateral, é por isso que você não pode fazer:E por que
sed
tem uma opção de edição no local.Por fim, fazendo:
é um uso inútil de gato , especialmente se você estiver tentando ler
file.txt
mais cedo.Se você deseja reverter um arquivo no local, não há atalhos . Você pode usar os truques
sed
ouawk
com a edição no local.fonte
>
é um redirecionador (operador) enviando a saída para outra coisa(entrada do próximo comando, impressora ..)
No seu caso, a saída vai para um arquivo
file.txt
, se esse arquivo já existir, será sobrescrito, caso contrário, ele será criado.>>
é um operador de acréscimo, sefile.txt
já existir, a saída será anexada ao final do arquivo. se o arquivo não existir, ele será criado e a saída gravada no novo arquivo, igual a>
(redirecionador).fonte
>
e>>
.Você pode usar o Vim no modo Ex:
%
selecione todas as linhas!
comando de execuçãox
salvar e fecharfonte