Comment ouvrir un éditeur d'une fonction bash?
Question
J'ai une fonction simple à ouvrir un éditeur:
open_an_editor() { nano "$1" }
Si elle est appelée comme open_an_editor file.ext
, cela fonctionne. Mais si je dois obtenir une sortie de la fonction - smth=$(open_an_editor file.ext)
- Je ne vois pas l'éditeur, le script seulement stucks. Que suis-je manque ici?
Mise à jour:. Je suis en train d'écrire une fonction qui demande à l'utilisateur d'écrire une valeur dans l'éditeur, si elle n'a pas été donné dans les arguments de script
#!/bin/bash open_an_editor() { if [ "$1" ] then echo "$1" return 0 fi tmpf=$(mktemp -t pref) echo "default value, please edit" > "$tmpf" # and here the editor should show up, # allowing user to edit the value and save it # this will stuck without showing the editor: #nano "$tmpf" # but this, with the help of Kimvais, works perfectly: nano "$tmpf" 3>&1 1>&2 2>&3 cat "$tmpf" rm "$tmpf" } something=$(open_an_editor "$1") # and then I can do something useful with that value, # for example count chars in it echo -n "$something" | wc -c
Alors, si le script a été appelé avec un ./script.sh "A value"
argument, la fonction serait tout simplement l'utiliser et l'écho immédiatement 7 octets. Mais si elle est appelée sans arguments ./script.sh
-. Nano devrait apparaître
La solution
Si l'entrée dont vous avez besoin est le fichier modifié, vous devez évidemment cat filename
après que vous faites le open_an_editor filename
Si vous avez besoin en fait la sortie de l'éditeur, alors vous devez échanger stderr et stdin i.e.:
nano "$1" 3>&1 1>&2 2>&3
Si yo besoin entrée utilisateur 'friendly', voir cette question sur la façon d'utiliser whiptail
Autres conseils
si vous avez besoin pour obtenir une sortie de la fonction et stocker dans la variable, vous affichez tout ce qui est dans le fichier.
open_an_editor()
{
cat "$1"
}
smth=$(open_an_editor file.txt)
Si tout ce que vous voulez est un utilisateur d'entrer une valeur alors read
suffit:
OLDIFS="$IFS"
IFS=$'\n'
read -p "Enter a value: " -e somevar
IFS="$OLDIFS"
echo "$somevar"