O formato abreviado pode estar relacionado ao shell, enquanto o toque é um comando independente. Portanto, a forma abreviada depende de qual shell você usa (e as pessoas têm fortes preferências nessa área), pois talvez nem todas elas forneçam o atalho. touchser autônomo funcionará da mesma maneira que você deve usar.
O primeiro exemplo deve ser editado para : >> fileou mesmo >> filepara que eles tenham o mesmo efeito, ou seja, NÃO destruindo o conteúdo do arquivo.
User000001
2
touchatualiza principalmente o mtime. Não esvazia um arquivo existente ao contrário >.
Rexkogitans 26/0518
2
Nenhum dos comandos "cria um arquivo vazio"; eles só terão esse resultado se o arquivo ainda não existir. Para garantir um arquivo vazio, você precisa > file.
Alexis 27/05
Respostas:
47
Você nem precisa usar :; você pode apenas > file(pelo menos em bash; outras conchas podem se comportar de maneira diferente).
Em termos práticos, não há diferença real aqui (embora a sobrecarga minúscula de chamar /bin/touchseja uma coisa).
touchno entanto, também pode ser usado para modificar os carimbos de data e hora em um arquivo que já existe sem alterar ou apagar o conteúdo; além disso, > fileexplodirá qualquer um fileque já exista. Isso pode ser contornado usando >> file.
Outra diferença touché que você pode criar (ou atualizar o registro de data e hora) vários arquivos de uma vez (por exemplo touch foo bar baz quux) com uma sintaxe mais sucinta do que com o redirecionamento, onde cada arquivo precisa de seu próprio redirecionamento (por exemplo >foo >bar >baz >quux).
Usando touch:
$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
File:"foo"Size:0FileType:RegularFileMode:(0644/-rw-r--r--)Uid:(991148597/redacted)Gid:(1640268302/redacted)Device:1,5Inode:8597208698Links:1Access:FriMay2510:55:192018Modify:FriMay2510:55:192018Change:FriMay2510:55:192018File:"foo"Size:0FileType:RegularFileMode:(0644/-rw-r--r--)Uid:(991148597/redacted)Gid:(1640268302/redacted)Device:1,5Inode:8597208698Links:1Access:FriMay2510:55:212018Modify:FriMay2510:55:212018Change:FriMay2510:55:212018
Usando o redirecionamento:
$ > foo; stat -x foo; sleep 2;>> foo; stat -x foo
File:"foo"Size:0FileType:RegularFileMode:(0644/-rw-r--r--)Uid:(991148597/redacted)Gid:(1640268302/redacted)Device:1,5Inode:8597208698Links:1Access:FriMay2510:55:212018Modify:FriMay2510:56:252018Change:FriMay2510:56:252018File:"foo"Size:0FileType:RegularFileMode:(0644/-rw-r--r--)Uid:(991148597/redacted)Gid:(1640268302/redacted)Device:1,5Inode:8597208698Links:1Access:FriMay2510:55:212018Modify:FriMay2510:56:252018Change:FriMay2510:56:252018
Parece que >> filenão atualizará o tempo de modificação. Não é o que o OP está procurando, mas apenas gostaria de salientar que não parece ser uma alternativa completa ao toque.
Jesse_b 25/05
2
Como a pergunta não especifica um shell específico. Pode ser bom ressaltar que > fileno zsh é equivalente a cat > file, não : > file.
JOL
Além disso, o tcsh permite : > file, mas erra > file. Talvez a equivalência de > fileto : > fileseja limitada ao bourne shell e bash?
JOL
+1 para rigor, no entanto, note que, em diversas conchas principais (eu até acho que todos ou a maioria das conchas porque a implementação mais simples seria naturalmente fazer com que este trabalho como um efeito colateral), você pode tocar vários arquivos usando o redirecionamento shell: : >foo >barou : >>foo >>barvai toque em ambos fooe bar.
Mtraceur
Só para ser pedante por causa do contexto da questão real aqui, mas : >foo >barnão touchos arquivos; ele redirecionará a saída (nula) :para os arquivos. touchtocaria nos arquivos. (:
DopeGhoti
32
Porque você pode touchvários arquivos de uma só vez sem digitar caracteres especiais extras. Isso inclui coisas como expansão de chaves, por exemplo touch file{1,2,3,4}.
Outra questão é que, quando você está escrevendo um tutorial, é bastante importante perceber que seus leitores provavelmente não são muito versados no assunto. Um comando simples pode ser muito mais compreensível do que uma combinação estranha de caracteres que não são da letra. Eu esperava que houvesse vários usuários casuais de shell que não sabem o que :é, pela simples razão de que ele realmente não faz nada. Da mesma forma para uma planície > foosem um comando: mesmo se você souber o que é um redirecionamento, um redirecionamento sem uma fonte pode não ser intuitivo.
Além disso, aqui no unix.se, frequentemente escrevemos exemplos de comandos com um sinal de cifrão à esquerda para indicar o prompt. Caracteres especiais no início da linha podem ser confundidos com isso. (Observe que existem sistemas e shells que são usados >como parte do prompt padrão.)
E se o comando não for completamente compreendido, sempre haverá "toque do homem". Duvido que "man:> file" retorne qualquer coisa útil :-) Além disso, os prompts do WRT, alguns (talvez a maioria) permitem que você defina o prompt para ser o que quiser. O meu mostra o nome do sistema (porque eu uso muitos xterms remotos) e o diretório atual e é definido com cores diferentes para sistemas diferentes.
Jamesqf # 25/18
1
@jamesqf, sim. Agora, é claro, também existe help :ou o que seu shell possui para documentação. Mas isso exige reconhecer :como um comando em si, lembrar que nem tudo tem uma página de manual e, finalmente, ser capaz de encontrar :na documentação. A última parte pode ser bastante difícil. : D
ilkkachu
@ jamesqf, e sim, eu quis dizer principalmente o caractere final do prompt padrão.
Ilkkachu
1
+1 por apontar os aspectos da intuição e do não-ser-um-obscuro-construto.
Mtraceur
@ilkkachu: Sim. Encontrando dois pontos na documentação não é tão difícil: encontrar o que não é apenas a pontuação é uma questão diferente :-)
jamesqf
18
Bem, para mim, a principal razão é a legibilidade. Com touch filevocê sabe o que está acontecendo, mesmo alguém que não é totalmente instruído em scripts de shell sabe o que está acontecendo. E se não, é fácil fazer man touche ver o seguinte:
A FILE argument that does not exist is created empty
Com coisas enigmáticas como :e >, é mais difícil saber o que está acontecendo e, como não há vantagem real, não há necessidade de usá-lo.
Imagine que você está procurando um de seus scripts shell antigos, dos quais você lembra apenas que algum arquivo de marcador em / tmp está sendo criado. É fácil grep todos os seus arquivos * .sh para a palavra "touch". Grepping por dois pontos resultará em muitos falsos positivos se você não souber qual nome de arquivo exato procurar.
touch
ser autônomo funcionará da mesma maneira que você deve usar.: >> file
ou mesmo>> file
para que eles tenham o mesmo efeito, ou seja, NÃO destruindo o conteúdo do arquivo.touch
atualiza principalmente o mtime. Não esvazia um arquivo existente ao contrário>
.> file
.Respostas:
Você nem precisa usar
:
; você pode apenas> file
(pelo menos embash
; outras conchas podem se comportar de maneira diferente).Em termos práticos, não há diferença real aqui (embora a sobrecarga minúscula de chamar
/bin/touch
seja uma coisa).touch
no entanto, também pode ser usado para modificar os carimbos de data e hora em um arquivo que já existe sem alterar ou apagar o conteúdo; além disso,> file
explodirá qualquer umfile
que já exista. Isso pode ser contornado usando>> file
.Outra diferença
touch
é que você pode criar (ou atualizar o registro de data e hora) vários arquivos de uma vez (por exemplotouch foo bar baz quux
) com uma sintaxe mais sucinta do que com o redirecionamento, onde cada arquivo precisa de seu próprio redirecionamento (por exemplo>foo >bar >baz >quux
).Usando
touch
:Usando o redirecionamento:
fonte
>> file
não atualizará o tempo de modificação. Não é o que o OP está procurando, mas apenas gostaria de salientar que não parece ser uma alternativa completa ao toque.> file
no zsh é equivalente acat > file
, não: > file
.: > file
, mas erra> file
. Talvez a equivalência de> file
to: > file
seja limitada ao bourne shell e bash?: >foo >bar
ou: >>foo >>bar
vai toque em ambosfoo
ebar
.: >foo >bar
nãotouch
os arquivos; ele redirecionará a saída (nula):
para os arquivos.touch
tocaria nos arquivos. (:Porque você pode
touch
vários arquivos de uma só vez sem digitar caracteres especiais extras. Isso inclui coisas como expansão de chaves, por exemplotouch file{1,2,3,4}
.Outra questão é que, quando você está escrevendo um tutorial, é bastante importante perceber que seus leitores provavelmente não são muito versados no assunto. Um comando simples pode ser muito mais compreensível do que uma combinação estranha de caracteres que não são da letra. Eu esperava que houvesse vários usuários casuais de shell que não sabem o que
:
é, pela simples razão de que ele realmente não faz nada. Da mesma forma para uma planície> foo
sem um comando: mesmo se você souber o que é um redirecionamento, um redirecionamento sem uma fonte pode não ser intuitivo.Além disso, aqui no unix.se, frequentemente escrevemos exemplos de comandos com um sinal de cifrão à esquerda para indicar o prompt. Caracteres especiais no início da linha podem ser confundidos com isso. (Observe que existem sistemas e shells que são usados
>
como parte do prompt padrão.)fonte
help :
ou o que seu shell possui para documentação. Mas isso exige reconhecer:
como um comando em si, lembrar que nem tudo tem uma página de manual e, finalmente, ser capaz de encontrar:
na documentação. A última parte pode ser bastante difícil. : DBem, para mim, a principal razão é a legibilidade. Com
touch file
você sabe o que está acontecendo, mesmo alguém que não é totalmente instruído em scripts de shell sabe o que está acontecendo. E se não, é fácil fazerman touch
e ver o seguinte:Com coisas enigmáticas como
:
e>
, é mais difícil saber o que está acontecendo e, como não há vantagem real, não há necessidade de usá-lo.fonte
Imagine que você está procurando um de seus scripts shell antigos, dos quais você lembra apenas que algum arquivo de marcador em / tmp está sendo criado. É fácil grep todos os seus arquivos * .sh para a palavra "touch". Grepping por dois pontos resultará em muitos falsos positivos se você não souber qual nome de arquivo exato procurar.
fonte