web-dev-qa-db-fra.com

Pourquoi bash refuse-t-il à mon script Shell l'autorisation d'ouvrir un fichier texte avec l'éditeur de texte par défaut?

Je suis dans: GNU _ bash, version 4.4.12 (1) -release (x86_64-pc-linux-gnu)

le script est: (note.sh)

 #! /bin/bash

edit="edit"

if [[ $edit = $1 ]]
then
    touch ~/.notes/"$2".txt
    $EDITOR ~/.notes/"$2".txt
else
    tree ~/.notes
fi

J'espérais que si je saisis dans bash: ./note.sh je reçois une sortie comme si j'avais tapé tree ~/.notes Mais je veux que ce script accepte les arguments, donc si je saisis ./note.sh edit new_note, puis si new_note. txt n’existe pas, touch ~/.notes/new_note.txt alors (Gedit pour moi) éditeur de texte ouvrant new_note.txt dans un terminal pour édition

l'instruction else fonctionne, mais ./note.sh edit new_note renvoie

./note.sh: line 10: /home/username/.notes/testnote.txt: Permission denied

C'est le toucher mais pas l'éditeur. Qu'est-ce qui se voit refuser l'autorisation ici?

Merci d'avance! Je suis très nouveau dans les scripts Shell et askubuntu et j'apprécie beaucoup votre aide.

5
Oreoplasm

En bash, la variable $EDITOR n'est pas définie par défaut. Cependant, il existe une commande qui appelle l'éditeur par défaut.

Pour cette commande c'est:

editor <filename>

Pour définir la commande à votre choix:

Sudo update-alternatives --config editor

Exemple:

terrance@terrance-ubuntu:~$ Sudo update-alternatives --config editor
There are 3 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path               Priority   Status
------------------------------------------------------------
  0            /bin/nano           40        auto mode
  1            /bin/ed            -100       manual mode
  2            /bin/nano           40        manual mode
* 3            /usr/bin/vim.tiny   10        manual mode

Press <enter> to keep the current choice[*], or type selection number:

Après avoir choisi votre éditeur par défaut, tout ce que vous avez à faire pour l'appeler dans votre script est:

editor ~/.notes/"$2".txt

J'espère que cela t'aides!

11
Terrance

La variable $EDITOR n'est pas définie, elle est donc vide lorsque vous atteignez cette ligne. Quitter ~/.notes/"$2".txt pour bash appeler.
Donc bash essaie ensuite d'exécuter /home/username/.notes/testnote.txt qui donne permission refusée car aucun indicateur d'exécutable n'a été défini pour le fichier.

Comme Terrance déjà mentionné, appelez directement la commande editor ou affectez un éditeur de texte valide à la variable $EDITOR.

EDITOR="/usr/bin/vi"

ou

EDITOR="/usr/bin/vim"

ou

EDITOR="/bin/nano"

ou tout autre éditeur de votre choix.

6
Thomas

En bref: Sur Debian/Ubuntu: exécutez sensible-editor.


Mais à propos de l'erreur que vous voyez:

Comme d'autres l'ont déjà mentionné, si EDITOR est vide ou non défini, le développement non cité de $EDITOR ne donne rien. Par conséquent, ce que le shell considère comme le premier mot de la ligne et le nom de fichier de la commande cela vient après.

Une extension citée "$EDITOR" donnerait un mot vide, ce qui vous donnerait une erreur déroutante lorsque le shell tente d'exécuter une chaîne vide une commande:

bash: : command not found

Vous souhaiterez probablement définir un repli dans le cas où EDITOR n'est pas défini. Vous pouvez utiliser l'extension ${par:-Word} pour cela. Par exemple. "${EDITOR:-vi}" utiliserait la valeur de EDITOR et si elle est vide ou non définie, revenez à vi.

Ensuite, il y a aussi VISUAL, qui remplit à peu près la même fonction, vous pouvez donc vérifier les deux: "${VISUAL:-${EDITOR:-vi}}".


Sur Ubuntu et les autres systèmes basés sur Debian, vous devez utiliser sensible-editor (au lieu de editor, vi ou nano) car autorise un paramètre par utilisateur de l'éditeur par défaut, contrairement à editor qui dépend du lien symbolique défini par update-alternatives.

sensible-editor vérifie également VISUAL et EDITOR, vous n'avez donc pas besoin de les vérifier explicitement, mais vous pouvez simplement exécuter sensible-editor $file et le résultat sera correct.

(Même si votre système est composé d'un seul utilisateur, il est bon de garder à l'esprit qu'il existe des systèmes multi-utilisateurs et que vous pouvez avoir plusieurs utilisateurs même sur un ordinateur de bureau.)

0
ilkkachu