Supondo que file2
já exista, o comando
> file1 < file2 cat
parece estar copiando o conteúdo de file2
para file1
.
Mas não consigo entender essa estrutura.
Entendo que "Nada" está sendo direcionado para file1
(criar ou apagar seu conteúdo). Então o conteúdo de file2
está sendo direcionado file1
.
Por que é cat
depois file2
? como saber cat file2
se os operandos não estão na ordem correta?
shell
io-redirection
shaqed
fonte
fonte
Respostas:
Antes de o shell executar o
cat
comando na linha de comando, ele procura por redirecionamentos.Existem dois redirecionamentos:
>file1
Isso fará com que a saída padrão do comando vá parafile1
.<file2
Isso fará com que a entrada padrão do comando venhafile2
.O fato de esses redirecionamentos serem colocados em um local instável na linha de comando não importa.
é o mesmo que
que é o mesmo que
etc.¹
Observe que o
cat
utilitário em todas essas instâncias é executado sem nenhum argumento de linha de comando . Os redirecionamentos não são operandos para ocat
comando, são instruções para o shell para configurar redirecionamentos para dentro e fora do comando (conectando sua entrada e saída padrão aos arquivos). O shell configura os redirecionamentos antes de chamar o comando.A diferença entre
cat file
ecat <file
(ou, se você preferir<file cat
) é que, no primeiro caso, ocat
próprio utilitário está abrindo o arquivo, que é fornecido como um operando na linha de comando, para leitura, enquanto no segundo caso, o shell irá abra o arquivo e conectecat
o fluxo de entrada a ele². No segundo caso,cat
notará que não recebeu um operando de arquivo e passará automaticamente para a leitura de sua entrada padrão. Esse é um recursocat
e alguns outros utilitários, não algo que todos os utilitários fazem.cat
também lerá sua entrada padrão se receber o operando-
. Novamente, isso é especial apenas paracat
e para alguns outros utilitários (ou seja, nada que o shell faça). Para usarcat
em um arquivo no diretório atual cujo nome é-
, adicione um caminho ao nome do arquivo, como./-
.¹ A ordem dos redirecionamentos ainda é importante em algumas circunstâncias; Com
cat <file2 >file1
, por exemplo,file1
não será truncado sefile2
estiver inacessível (os redirecionamentos são analisados da esquerda para a direita). A colocação relativa da palavracat
ainda é arbitrária e não influenciará isso.² Veja também a pergunta " cat dá erro diferente ao abrir arquivo inexistente ".
O fato de o shell configurar os redirecionamentos antes mesmo de executar o comando na linha de comando é o motivo pelo qual essas coisas falham e você acaba com um arquivo de saída vazio:
Aqui, o shell truncará (esvaziará) o arquivo
file
antes de executarsort file
e conectarsort
a saída padrão do arquivo. Osort
utilitário abriráfile
e classificará seu conteúdo (o que não é nada). O resultado (nada) é passado pelo fluxo de saída padrão parafile
.O remédio nesse caso específico (para classificar um arquivo "no local") é
ou
que é mais ou menos o que
sort
faz ao usar o-o
arquivo para especificar o nome do arquivo de saída.Apenas para fazer backup da declaração de que os redirecionamentos podem preceder o nome real do utilitário na linha de comando:
E também sobre o redirecionamento não fazer parte dos operandos do utilitário:
fonte
<in foo | bar >out
coloca tudo em ordem lógica. Eu também gosto seecho >&2 Something bad happened
a saída de erro de scripts de shell. Mas>out <in cat
é ofuscação apenassort file >file
ser realizado corretamente?sort -o file file
.< file1 > file2 cat
seria melhor do> file2 < file1 cat
que evitariafile2
ser truncado sefile1
não puder ser aberto.