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 eu criar um novo arquivo .gitignore sob o diretório atual usando o bash, descobri que posso fazer:

> .gitignore

ou

touch .gitignore

Parece que eles fazem a mesma coisa. Quando eu verifico o manual para touch , ele diz "Alterar registro 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 existe alguma diferença em usar esses dois comandos nesse contexto? Obrigado.

    
por Steve Deng Zishi 07.02.2017 / 17:15

2 respostas

21

> é o operador de redirecionamento do shell. Veja 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 criará. Se existir, o shell trunca (esvazia). Com apenas > file , não há comando, portanto, o shell cria um arquivo, mas nenhuma saída é enviada a ele, portanto, o efeito de rede é 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, diferente de > .

O comportamento de > depende do shell. No bash, no dash e na maioria dos shells, > foo funcionará conforme o esperado. Em zsh, por padrão, > foo funciona como cat > foo - zsh espera que você digite entrada.

    
por muru 07.02.2017 / 17:24
2

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
    
por Steven Penny 08.02.2017 / 02:14