Qual é a diferença no uso de "touch file" e "> file" na criação de um novo arquivo?

13

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.

Steve Deng Zishi
fonte
1
Estou curioso para saber onde você aprendeu a usar '>' como um gerador de arquivo sem aprender o seu uso pretendido
forresthopkinsa
1
Você encontrará o redirecionamento documentado no manual do Bash. Na linha de comando, digite o comando 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.
Paddy Landau

Respostas:

21

>é 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. Com touch, 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, > foofuncionará conforme o esperado. No zsh, por padrão, > foofunciona como cat > foo- zsh espera por você digitar a entrada.

muru
fonte
10
O ponto principal aqui é que não há diferença prática entre >> filee, touch filemas se filenão existe, há uma grande diferença entre eles e > file(na medida em que o conteúdo anterior de fileé perdido). Além disso, o comportamento inconsistente dos meios zsh touch fileé o "mais seguro" e, portanto, deve ser memorizado como o caminho certo para fazê-lo.
Monty mais duros
1

Aqui está uma comparação interessante:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

Resultado:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472
Steven Penny
fonte
1
Embora a comparação possa ser interessante, eu realmente não vejo o que você quer que eu veja aqui. Você pode explicar o que está procurando? Eu acho que são diferentes maneiras de escrever coisas em arquivos, mas acho um pouco confuso assim. Pode ser minha falta de café.
M00am 08/02
@ m00am, o que é mostrado aqui é efetivamente 8 maneiras diferentes de criar um arquivo. stracedeve mostrar as chamadas do sistema que estão sendo executadas, e o > file.txtmé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, é que straceescreve para stderrtransmitir por padrão e, nesta resposta, Steven usa pipe para somente leitura stderr, por isso estou um pouco confuso como ele contou as linhas usando |cachimbo e não|&
Sergiy Kolodyazhnyy
E no Ubuntu 16.04, usando |&, como @Serg menciona, eu recebo a contagem cerca de um quinto dos mais aqui ... exceto para o vicaso, onde eu recebo sobre o mesmo valor
Muru
WSL? Uau ... eu não acho WSL gostaria de acrescentar que muitas chamadas do sistema para que ele faz.
muru
@muru Cygwin - A WSL ainda não está pronta stackoverflow.com/a/40370009
Steven Penny