redirecionamento shell entendimento sobre arquivos inexistentes
-
07-07-2019 - |
Pergunta
ls > ls.out
isso vai incluir ls.out na lista também. O meu entendimento é:> (operador de shell redirecionamento de saída é a criação de um arquivo primeiro (para tomar o STDOUT) se não for já existente e, em seguida, o comando ls está vindo para jogar e está incluindo o recém-criado ls.out arquivo na saída. Isso é correto? Se não, você pode por favor elaborar o funcionamento desse comando.
Da mesma forma
wc temp > temp
Será imprimir 0 0 0 temperatura dentro do arquivo temporário recém-criado.
Este comportamento do shell é interessante. Pergunto-me, como ele está realmente trabalhando. BTW, ambos são exercícios no Unix Programação Ambiente Book. Como eu mencionei a resposta acima, eu quero algum especialista para corrigir o meu entendimento.
Solução
Ao redirecionar a saída padrão com >
, o shell irá criar o arquivo (como um arquivo vazio) se ele ainda não existir. Além disso, esse arquivo é aberto antes de os garfos de shell e executivos o comando a ser executado. Quando você faz wc temp > temp
, o shell abre o arquivo para escrever e, em seguida, garfos e execs wc
, passando em seus arquivos abertos no processo.
Outras dicas
simplificação:
ls
está olhando para o inode (entrada de diretório) que o redirecionamento criado.
wc
pode ver o inode que o redirecionamento criado, mas quando se olha para o conteúdo que eles estão vazios porque (wc
) não escreveu ainda.
Editar:
Em primeiro lugar, em ambos os casos, o redirecionamento (>ls.out
ou >temp
) cria um arquivo vazio. Uma entrada (inode) no diretório é feita para apontar para o local do arquivo e contêm algumas informações sobre ele. Veja o artigo da Wikipedia sobre inodes .
A seguir, no caso de ls
, todas as entradas no diretório, incluindo um para ls.out
que acabou de ser criada , são lidos e escritos para stdout
(que, neste caso, torna-se o conteúdo do ls.out
).
Ou, no caso de wc
, ele está contando as contagens de nova linha, palavra e byte do arquivo chamado temp
recentemente criado que está vazio para que ele escreve a contagem de zero para o arquivo depois ele conta (nada).
O conteúdo dos arquivos (temp
ou ls.out
) não são escritas até depois de toda a leitura é feito de modo que eles não podem ter sido incluídos.
Para um melhor maneira de comparar que ls
e wc
estão fazendo, tentar este comando (quando ls.out
é inexistente):
ls -l > ls.out
Você deverá ver que o tamanho do arquivo para ls.out
é zero de acordo com a lista contida dentro (cat ls.out
), mas se você fizer ls -l ls.out
você verá que não é zero. Isso corresponde ao que você vê acontecendo com wc
.
considerar wc -l temp > temp
Se temp
já existia e tinha dizer 20 linhas ainda o resultado de cat temp
depois de executar o comando acima, será 0 temporário.
Eu acho que isso é porque o shell cria um novo temp
vazia mesmo se temp
existiu, assim, substituir a temperatura existente e, portanto, quando tenta wc
para contar o num de linhas em temp
ele recebe zero.
Com efeito > temp
é executado pelo shell primeiro e depois wc -l temp
é executado.