web-dev-qa-db-fra.com

Pourquoi Sudo gedit n'ouvre-t-il pas les fichiers commençant par Exclamation

Lorsque vous essayez d'ouvrir un fichier avec Sudo gedit /path/to/file avec un nom de fichier commençant par ! devant, par exemple !config.ini, je ne peux pas ouvrir le fichier. Cependant, si je fais Sudo nautilus, puis que j'ouvre le fichier avec gedit, il s'ouvre. Si le fichier est renommé config.ini Sudo gedit fonctionne à nouveau. Quelqu'un pourrait-il m'expliquer, s'il vous plaît?.

5
damien

Vous entrez la commande Sudo gedit /path/to/file dans un shell (par défaut, bash), mais les shells modernes utilisent le caractère "!" personnage à des fins spéciales. Les caractères spéciaux peuvent être interprétés sans signification particulière en les faisant précéder du caractère '\'.

Essayer:

gksu gedit /path/to/\!file

au lieu de

gksu gedit /path/to/!file

Dans les shells modernes, les commandes que vous entrez sont mémorisées et vous pouvez les ressaisir en utilisant le signe "!" personnage. !! par exemple, rentre la dernière commande. Comme Uri le fait remarquer, cela s'appelle un indicateur d'événement. L'interprète bash vous permet également d'utiliser Ctrl-R pour trouver facilement les commandes que vous souhaitez ré-entrer, mais le caractère '!' Le mécanisme est toujours là pour nous, les anciens, qui avons l'habitude d'utiliser '!' au lieu. Autres utilisations de "!" inclure le $! paramètre et son utilisation dans les expressions arithmétiques et logiques.

Une référence bash peut être utile si vous rencontrez de tels mystères car les coquilles peuvent être très compliquées. Le manuel de gnu bash est ici .

Uri a utilement mentionné que vous devriez utiliser gksu ou gksudo plutôt que Sudo. Il y a une explication ici: Quelle est la différence entre "gksudo nautilus" et "Sudo nautilus"? .

8
John S Gruber

La solution facile consiste à désactiver de manière permanente le développement de l'historique en ajoutant la ligne suivante à votre ~/.bashrc

set +H

Si vous n'avez jamais utilisé intentionnellement l'expansion de l'historique, vous ne manquerez rien en la désactivant.

5
geirha

C'est un désignateur d'événement.

voir man bash:

  • ! Développe l'ID de processus de la commande d'arrière-plan (asynchrone) la plus récemment exécutée.
1
Uri Herrera

Une solution complète consisterait à mettre le nom du répertoire entre guillemets simples (').

Exemple

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

0
AlexandroSan12