Respostas:
touch
primeiro, o arquivo confirma que você realmente tem a capacidade de criar o arquivo, em vez de perder tempo em um editor apenas para descobrir que o sistema de arquivos é somente leitura ou algum outro problema.
:w
primeira coisa depois de iniciar vi
. (e :chmod +x %
se você quiser torná-lo executável)
touch
pode falhar onde vi
's :w!
teria conseguido embora (por exemplo, se file
existe, mas você não é seu dono e não tem acesso de gravação para que, enquanto você tem acesso de gravação para o diretório atual). Por outro lado, touch
pode ter sucesso, mas vi
's :w
ou :w!
pode falhar se você é dono do arquivo, mas não têm acesso de gravação para ele, nem para o diretório atual (você seria capaz de trabalhar em torno dele com :!chmod +w %
(algumas vi
implementações, como vim
pode fazer que automaticamente após :w!
)).
"foo" [readonly]
. E novamente ao entrar no modo de inserção:Warning: Changing a readonly file.
Além das respostas fornecidas, uma vantagem do toque é que qualquer outro usuário / terminal que edite o mesmo arquivo enquanto você o tocou receberá um aviso ao tentar salvar as alterações.
WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?
Isso os alertaria, mesmo que você não tenha feito alterações em si e apenas tenha tocado o arquivo.
Além da resposta aceita:
Vale ressaltar que touch
é usado para atualizar os registros de data e hora do arquivo. Se você usar touch
um arquivo existente, ele atualizará o carimbo de data / hora dos arquivos para a data e hora atuais. Se o arquivo não existir, ele criará um arquivo vazio com a data e hora atuais como o carimbo de data / hora.
vi
, por outro lado, não cria um novo arquivo, a menos que você grave nele.
Por exemplo, se eu digitei vi test.txt
, digitei algumas notas e digitei :q!
; test.txt
não existiria.
Sem touch
, um novo arquivo não existirá até você pedir vi
para escrevê-lo.
Considere um sistema multiusuário (talvez você esteja em um sistema de arquivos montado em rede compartilhado por muitos sistemas, cada um com muitos usuários). A execução touch
garantirá que você tenha o arquivo (e que possa gravá-lo) e até atualize o registro de data e hora. Outro usuário que deseja criar esse arquivo verá que você é o proprietário. Se ele já existir e outro usuário quiser excluí-lo ou substituí-lo, ele verá que foi modificado recentemente e talvez pense duas vezes.
Não há benefício em touch
primeiro lugar; vi
criará o arquivo se ele não existir.
A resposta aceita diz que verifica se você pode escrever lá antes de perder tempo em um editor. É verdade, mas agora você estará perdendo tempo digitando touch
todas as vezes. Não poder escrever em algum lugar é excepcional, comparado com a frequência com que apenas funcionará (desde que você lembre-se sudo
de arquivos fora do diretório inicial ou /tmp
, ou esteja logado como root).
Basta abrir o editor e fazer o que quiser, depois tente salvar o arquivo. Se não funcionar, mesmo com :w!
, salve-o em outro lugar ( :w ~/asdf
) e corrija o problema. Uma vez que é fixo, você pode copiar o conteúdo do arquivo do arquivo temporário para o original: cat ~/asdf > /mnt/example.txt && rm ~/asdf
. O motivo pelo qual usamos em cat
vez de mv
ou cp
é usar as permissões do destino e outros atributos.
Além disso, para alguns uso de linha de comando mais avançado, você poderia fundo vi
com Ctrl+ Zenquanto você corrigir o problema (ou o uso :suspend
, ou :sus
), e finalmente fg
novamente para executar o comando de escrita.
Editar: postagem melhorada em resposta aos comentários de / u / G-Man . Obrigado!
/mnt/example.txt
não deve ser legível pelo mundo, mas o seu umask está definido como algo permissivo como 22, /tmp/asdf
será legível pelo mundo. Se houver outras pessoas no sistema, elas poderão ler a cópia temporária do arquivo. (2) O arquivo /mnt/example.txt
provavelmente não deve ser gravável no mundo, mas, se houver pessoas mal-intencionadas no sistema, elas poderão ler a cópia temporária do arquivo e substituí-lo por uma versão modificada antes de mover / copiar de volta ao local certo. ... (continua)
/tmp
pode impedir isso.) (3) O comando mv /tmp/asdf /mnt/example.txt
destruirá totalmente a corrente /mnt/example.txt
e a substituirá /tmp/asdf
. Você deseja substituir o conteúdo da /mnt/example.txt
com o conteúdo de /tmp/asdf
. Usando mv
, você configura /mnt/example.txt
a ter os mesmos atributos como /tmp/asdf
- provavelmente pertencentes a você e mundialmente legível. Pode ser melhor cp /tmp/asdf /mnt/example.txt
ou até mesmo cat /tmp/asdf > /mnt/example.txt
. … PS (4) Você pode suspender vi
digitando :suspend
(ou :sus
, abreviado).
/tmp
, mas não há desculpa para não escrever ~/
. Eu também não tinha pensado que isso substituiria os atributos. Vou editar meu post, graças :)
vi
é um editor de texto visual (vi = visual) É visual comparado com "ed" de qualquer maneira, o que permite ver e alterar uma linha de texto por vez.
O touch
comando atualiza o registro de data e hora em um arquivo existente ou cria um novo arquivo se o arquivo ainda não existir. É bom para testar coisas altamente dependentes de carimbos de data e hora.
Agora, se o seu arquivo é um arquivo de texto, ou ainda não existe, abri-lo com vi e, em seguida, emitir o comando :wq
para vi, teria o mesmo resultado que tocar nesse arquivo. Essa é a única maneira que os dois comandos são semelhantes.
Especificamente para uso com vi
, não há necessidade de criar o arquivo antes de editá-lo: vi
pode ser usado para criar e salvar um novo arquivo. No entanto, existem contextos de chamada nos quais o arquivo precisa existir. Por exemplo, no meu sistema (OS X), posso iniciar um editor de GUI apropriado (determinado pelo tipo de arquivo) assim:
open foo.txt
Isso abriria foo.txt
no TextEdit, no emacs, ou o que eu especificasse como meu editor de escolha para arquivos de texto, e desanexaria o processo para que eu recebesse meu prompt imediatamente. ( open bar.py
pode abri-lo no IDLE, o editor python; etc.) Ou posso solicitar explicitamente o emacs:
open -a emacs foo.txt
Mas open
exige que o arquivo já exista, caso contrário, gera um erro. Então eu tive que definir emacs
a seguinte função shell, o que me permite escrever emacs foo
para iniciar a emacs
GUI, mesmo que foo
ela não exista.
function emacs ()
{
if [ -n "$1" -a ! -e "$1" ]; then
/usr/bin/touch "$1";
fi;
open -a emacs "$@"
}
O vi é usado para editar um arquivo como usuário, enquanto o touch pode definir o carimbo de data e hora e é usado principalmente em scripts e afins.
Outra maneira de criar um arquivo é:
>newfile.txt
zsh
, é idêntico cat >newfile.txt
e precisa que você pressione Ctrl + D.
Pela página de manual do toque, seu trabalho principal é alterar os registros de data e hora do arquivo.
Ofc também está criando o arquivo com o carimbo de data / hora atual e, em seguida, você pode editar o arquivo.
VI é um editor de texto que faz o que diz: editar texto aberto, salvar, editar arquivo, etc.
Tudo é uma característica do usuário e do habbit: toque em vi ou vi file.txt na mesma coisa em cores diferentes.
touch
permite que você façachmod +x
depois, antes da edição, o que faria sentido se você estivesse escrevendo um#!/bin/bash
shell script.