Search code examples
linuxbashnano

How to open an editor from a bash function?


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.


Solution

  • 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