Por que o sudo gedit NÃO abre arquivos a partir do Exclamation mark?

5

Ao tentar abrir um arquivo com sudo gedit /path/to/file com um nome de arquivo começando com ! na frente, por exemplo, !config.ini i não é possível abrir o arquivo. No entanto, se eu sudo nautilus, em seguida, abra o arquivo com o gedit abre.Se o arquivo é renomeado config.ini sudo gedit funciona novamente.Could alguém explicar isso para mim por favor.

    
por damien 04.08.2012 / 01:17

4 respostas

8

Você está digitando o comando sudo gedit /path/to/file em um shell (por padrão bash), mas os shells modernos usam o '!' personagem para fins especiais. Caracteres especiais podem ser interpretados sem significado especial, precedendo-os com o caractere '\'.

Tente:

gksu gedit /path/to/\!file

em vez de

gksu gedit /path/to/!file

Nos shells modernos, os comandos que você digita são lembrados e você pode reinseri-los usando o '!' personagem. !! , por exemplo, reentra o último comando. Como Uri aponta, isso é chamado de designador de evento. O intérprete bash também permite usar o Ctrl-R para encontrar facilmente os comandos que você quer reinserir, mas o '!' mecanismo ainda está lá para nós veteranos que têm o hábito de usar '!' em vez de. Outros usos de "!" inclua o $! parâmetro, e seu uso em expressões aritméticas e lógicas.

Uma referência de bash pode ser útil se você se deparar com tais mistérios, porque os shells podem ser muito complicados. O manual do gnu bash é aqui .

Uri gentilmente mencionou que você deveria usar gksu ou gksudo em vez de sudo. Há uma explicação aqui: Qual é a diferença entre " gksudo nautilus "e" sudo nautilus "? .

    
por John S Gruber 04.08.2012 / 01:34
5

A solução fácil é desativar a expansão do histórico permanentemente, adicionando a seguinte linha ao seu ~/.bashrc

set +H

Se você nunca usou intencionalmente a expansão do histórico, não vai perder nada desativando-a.

    
por geirha 04.08.2012 / 19:35
1

É um designador de evento.

veja man bash :

  • ! Expande-se para o ID do processo dos back-ends executados mais recentemente           comando terrestre (assíncrono).
por Uri Herrera 04.08.2012 / 01:31
0

Uma solução completa seria colocar o nome do diretório entre aspas simples ( ' ).

Exemplo

sudo gedit /media/alexandro/'Disco Local'/'Dropbox (Equipe Alexandro)'/Pessoal/'!A Organizar'/Documentos/'!asd.txt'

    
por AlexandroSan12 13.05.2014 / 12:48