Atenção por FAVOR:
Estou não perguntando como fazer um arquivo a partir da linha de comando!
Eu tenho usado touch
para criar arquivos há anos sem prestar atenção que seu principal objetivo é outra coisa. Se alguém quiser criar um arquivo a partir da linha de comando, há muitas possibilidades:
touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar
E tenho certeza que há mais.
Mas o fato é que nenhum dos comandos acima foi projetado para criar arquivos. Por exemplo, man touch
sugere que este comando é para alterar os carimbos de data / hora do arquivo. Por que um sistema operacional tão completo quanto o Unix (ou Linux) não possui um comando projetado apenas para criar arquivos?
bash
shell
command-line
files
Pouya
fonte
fonte
cat
conexão!more
quandoless
faz mais do que aquilomore
!? Oudir
els
. Embora eu esteja ciente dos problemas de compatibilidade.more
antecede a criação deless
.less
foi criado especificamente para solucionar deficiências demore
.more
ainda existe por motivos de compatibilidade com versões anteriores.dir
els
são, para a maioria das intenções e propósitos, o mesmo executável - eles diferem apenas em alguns bytes. Uma nova ferramenta que se destina especificamente para a criação de arquivos faria menos do que as ferramentas existentes, e como tal seria uma regressão, e não uma melhoria, como no caso daless
vsmore
.Respostas:
Eu diria porque quase nunca é necessário criar um arquivo vazio que você não preencha com conteúdo imediatamente na linha de comando ou no script de shell.
Não há absolutamente nenhum benefício em criar um arquivo primeiro e depois usar o redirecionamento de E / S para gravar no arquivo, se você puder fazê-lo em uma única etapa.
Nos casos em que você realmente deseja criar um arquivo vazio e deixá-lo, eu argumentaria que
> "${file}"
não poderia ser mais breve e mais elegante.TL; DR : ele não existe porque a criação de arquivos vazios geralmente não tem uso e, nos casos em que existe, já existem inúmeras opções disponíveis para atingir esse objetivo.
Por outro lado, usar
touch
somente funciona se o arquivo não existir, enquanto as opções usando o redirecionamento sempre truncarão o arquivo, mesmo que ele exista (portanto, tecnicamente, essas soluções não são idênticas).> foo
é o método preferido, pois salva umfork
eecho -n
deve ser evitado em geral, pois é altamente não transportável.fonte
>>
). Eu estava me referindo aos exemplos dados pelo OP usando>
. Anexar seria inútil se o que você procura é criar arquivos (ou sair NOOP, se existirem).noclobber
isso não deve ser definido para>
substituir um arquivo existente.alias rm='rm -i'
vez de nãoalias rmi='rm -i'
é uma boa idéia.> .file
em uma linha de comando, fará isso perfeitamente sem o:
.A resposta de Adrian Frühwirth está certa. Eu só queria acrescentar que na verdade existe um comando escrito especificamente para criar arquivos:
mktemp
.O trabalho de Granted
mktemp
não é criar um arquivo com um nome específico, é simplesmente criar um arquivo . No entanto, como você já foi informado, existem muitas maneiras mais eficientes e elegantes de criar arquivos com um determinado nome, que fornecer um comando para isso seria inútil.Dito isto, você também tem
truncate
e osfallocate
dois cujo objetivo essencial é criar arquivos. Eles simplesmente têm uma abordagem mais sofisticada. Nunca haverá um programa simples que faça o que> file
faz, pois não há como ser melhor do que isso> file
.fonte
A maioria das ferramentas básicas de shell não são projetadas para nenhum propósito muito específico. A maioria das ferramentas básicas de shell são projetadas apenas para interagir com outras pessoas e atingir seu objetivo. Ou talvez deva-se dizer que a maioria das ferramentas faz apenas uma coisa muito básica, independentemente de como elas podem ser combinadas para atingir uma meta.
Isso cria um arquivo vazio. Ou trunca um arquivo existente como você deseja. Você pode:
para evitar qualquer possibilidade do último caso, a menos que você:
Você pode obter um comportamento semelhante ao
touch
com:Exceto que
:
não atualizará o modtime de um arquivo porque ele não é modificado.DEMO
SAÍDA
NÃO TOQUE
SAÍDA
fonte
\n
no final da linha. Tenteecho -n >echo-n.file
(tamanho = 0) eecho -e >echo-e.file
(tamanho = 1)cat
. Por que ter um comando para exibir um arquivo, quando você pode fazer um comando para concatenar vários arquivos na saída padrão?O utilitário
install
foi projetado para criar arquivos! Você pode transmitir o conteúdo do arquivo via/dev/stdin
(na maioria dos casos, no entanto, na maioria dos tipos de Linux, isso requer que/proc
esteja montado) ou fornecer outro arquivo de origem. Você pode definir a propriedade e as permissões.como um exemplo bobo.
fonte