Uso do toque e vi?

55

Existe o benefício de criar um arquivo com toque antes da edição .. como:

touch foo
vi foo

versus obtê-lo para o editor imediatamente? Gostar:

vi foo

Eu vejo alguns tutoriais usando o primeiro ( touchentão vi).

Fawix
fonte

Respostas:

111

touchprimeiro, 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.

DopeGhoti
fonte
6
E touchpermite que você faça chmod +xdepois, antes da edição, o que faria sentido se você estivesse escrevendo um #!/bin/bashshell script.
Aaron McDaid
11
Como alternativa, você pode fazer a :wprimeira coisa depois de iniciar vi. (e :chmod +x %se você quiser torná-lo executável)
Stéphane Chazelas
26
touchpode falhar onde vi's :w!teria conseguido embora (por exemplo, se fileexiste, 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, touchpode ter sucesso, mas vi's :wou :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 viimplementações, como vimpode fazer que automaticamente após :w!)).
Stéphane Chazelas
faz muito sentido agora!
Fawix
4
Vim / vi muito claramente estado se você abrir um arquivo que você não tem permissão para gravar: "foo" [readonly]. E novamente ao entrar no modo de inserção:Warning: Changing a readonly file.
DevSolar 06/06
25

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.

amisax
fonte
bom ponto, então é essencialmente uma boa maneira de descobrir se as pessoas estão usando / editando o mesmo arquivo e avisá-las ao mesmo tempo. Vejo um benefício claro disso em um ambiente com vários inquilinos!
Fawix
@Fawix então você deve atualizar essa resposta Aswell
kiwy
19

Além da resposta aceita:

Vale ressaltar que touché usado para atualizar os registros de data e hora do arquivo. Se você usar touchum 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.txtnão existiria.

Peschke
fonte
E o benefício descrito na resposta aceita?
JBentley
8

Sem touch, um novo arquivo não existirá até você pedir vipara 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 touchgarantirá 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.

Adam Katz
fonte
4

Não há benefício em touchprimeiro lugar; vicriará 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 touchtodas as vezes. Não poder escrever em algum lugar é excepcional, comparado com a frequência com que apenas funcionará (desde que você lembre-se sudode 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 catvez de mvou 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 vicom Ctrl+ Zenquanto você corrigir o problema (ou o uso :suspend, ou :sus), e finalmente fgnovamente para executar o comando de escrita.

Editar: postagem melhorada em resposta aos comentários de / u / G-Man . Obrigado!

Luc
fonte
3
Existem alguns problemas de segurança aqui: (1) Se o arquivo /mnt/example.txtnã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.txtprovavelmente 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)
G-Man diz 'Restabelecer Monica' em
3
(Continua)… (A ativação do bit adesivo /tmppode impedir isso.) (3) O comando mv /tmp/asdf /mnt/example.txtdestruirá totalmente a corrente /mnt/example.txte a substituirá /tmp/asdf. Você deseja substituir o conteúdo da /mnt/example.txtcom o conteúdo de /tmp/asdf. Usando mv, você configura /mnt/example.txta ter os mesmos atributos como /tmp/asdf- provavelmente pertencentes a você e mundialmente legível. Pode ser melhor cp /tmp/asdf /mnt/example.txtou até mesmo cat /tmp/asdf > /mnt/example.txt. … PS (4) Você pode suspender vidigitando :suspend(ou :sus, abreviado).
G-Man Diz 'Reinstate Monica'
@ G-Man Esses são alguns pontos positivos. Não estou particularmente com medo de alguém roubar um arquivo durante os cinco minutos em que ele está /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 :)
Luc
3

Não há benefício. vicriará um arquivo se não existir.

ronakg
fonte
1

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 touchcomando 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 :wqpara vi, teria o mesmo resultado que tocar nesse arquivo. Essa é a única maneira que os dois comandos são semelhantes.

malyy
fonte
1

Especificamente para uso com vi, não há necessidade de criar o arquivo antes de editá-lo: vipode 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.txtno 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.pypode abri-lo no IDLE, o editor python; etc.) Ou posso solicitar explicitamente o emacs:

open -a emacs foo.txt

Mas openexige que o arquivo já exista, caso contrário, gera um erro. Então eu tive que definir emacsa seguinte função shell, o que me permite escrever emacs foopara iniciar a emacsGUI, mesmo que fooela não exista.

function emacs () 
{ 
    if [ -n "$1" -a ! -e "$1" ]; then
        /usr/bin/touch "$1";
    fi;
    open -a emacs "$@"
}
alexis
fonte
0

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
licklake
fonte
11
Isso não é confiável, porque não está especificado na especificação POSIX. Por exemplo, In zsh, é idêntico cat >newfile.txte precisa que você pressione Ctrl + D.
Adam Katz
@AdamKatz good point; Atualizei a resposta, obrigado pelo conselho.
precisa
0

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.

igiannak
fonte
0

touch O comando altera a data e hora de um arquivo com carimbo de data / hora atual.
se o arquivo for não existir, ele cria um novo arquivo com data e hora.

vi editor é usado para editar arquivos, se o arquivo não existir, ele cria um novo arquivo, a menos que não salve o arquivo.

Premraj
fonte