Eu sou novo no Linux. Quando crio um novo arquivo .gitignore no diretório atual usando o bash, descobri que posso:
> .gitignore
ou
touch .gitignore
Parece que eles fazem a mesma coisa. Quando verifico o manual touch
, ele diz que altera o carimbo de data e hora para o arquivo atual, mas não há manual para >
. Então, alguém pode explicar o que pode >
fazer e há alguma diferença no uso desses dois comandos nesse contexto? Obrigado.
command-line
Steve Deng Zishi
fonte
fonte
man bash
. É um documento longo e levará dias ou até semanas para entender bem, mas vale a pena analisar se você quiser aprender o Bash completamente.Respostas:
>
é o operador de redirecionamento de shell. Consulte Qual é a diferença entre ">" e ">>" no comando shell? e Quando devo usar <ou <() ou << e> ou> ()? É usado principalmente para redirecionar a saída de um comando para um arquivo. Se o arquivo não existir, o shell o cria. Se existir, o shell o trunca (esvazia). Com just> file
, não há comando, portanto o shell cria um arquivo, mas nenhuma saída é enviada a ele; portanto, o efeito líquido é a criação de um arquivo vazio ou o esvaziamento de um arquivo existente.touch
é um comando externo que cria um arquivo ou atualiza o registro de data e hora, como você já sabe. Comtouch
, o conteúdo do arquivo não é perdido, se existir, ao contrário de>
.O comportamento de
>
depende do shell. No bash, dash e na maioria das conchas,> foo
funcionará conforme o esperado. No zsh, por padrão,> foo
funciona comocat > foo
- zsh espera por você digitar a entrada.fonte
>> file
e,touch file
mas sefile
não existe, há uma grande diferença entre eles e> file
(na medida em que o conteúdo anterior defile
é perdido). Além disso, o comportamento inconsistente dos meios zshtouch file
é o "mais seguro" e, portanto, deve ser memorizado como o caminho certo para fazê-lo.Aqui está uma comparação interessante:
Resultado:
fonte
strace
deve mostrar as chamadas do sistema que estão sendo executadas, e o> file.txt
método é mostrado como a menor quantidade de chamadas do sistema executadas, o que realmente não é tão surpreendente - quanto mais complexa é uma ferramenta, mais complexos são os syscalls. O problema com os exemplos mostrados, no entanto, é questrace
escreve parastderr
transmitir por padrão e, nesta resposta, Steven usa pipe para somente leiturastderr
, por isso estou um pouco confuso como ele contou as linhas usando|
cachimbo e não|&
|&
, como @Serg menciona, eu recebo a contagem cerca de um quinto dos mais aqui ... exceto para ovi
caso, onde eu recebo sobre o mesmo valor