I have a simple function to open an editor:
open_an_editor() { nano "$1" }
If called like open_an_editor file.ext
, it works. But if I need to get some output from the function — smth=$(open_an_editor file.ext)
— I cannot see the editor, script just stucks. What am I missing here?
Update: I am trying to write a function which would ask the user to write a value in editor, if it wasn't given in script arguments.
#!/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
So, if the script was called with an argument ./script.sh "A value"
, the function would just use that and immediately echo 7 bytes. But if called without arguments ./script.sh
— nano should pop up.
If the input you need is the edited file, then you obviously need to cat filename
after you do the open_an_editor filename
If you actually need the output of the editor, then you need to swap stderr and stdin i.e:
nano "$1" 3>&1 1>&2 2>&3
If yo need 'friendly' user input, see this question on how to use whiptail