Как открыть редактор из функции bash? - PullRequest
2 голосов
/ 02 марта 2010

У меня есть простая функция для открытия редактора:

open_an_editor()
{
    nano "$1"
}

Если вызывается как open_an_editor file.ext, это работает. Но если мне нужно получить какой-то вывод из функции - smth=$(open_an_editor file.ext) - я не могу увидеть редактор, скрипт просто завис. Что мне здесь не хватает?

Обновление: я пытаюсь написать функцию, которая попросила бы пользователя написать значение в редакторе, если оно не было задано в аргументах сценария.

#!/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

Итак, если скрипт вызывался с аргументом ./script.sh "A value", функция просто использовала бы это и немедленно выводила бы 7 байтов. Но если вызывается без аргументов ./script.sh - должен появиться nano.

Ответы [ 3 ]

2 голосов
/ 02 марта 2010

Если вам нужен отредактированный файл, то вам, очевидно, нужно cat filename после того, как вы выполните open_an_editor filename

Если вам действительно нужен вывод редактора, тогда вам нужно поменять местами stderr и stdin, т.е. nano "$1" 3>&1 1>&2 2>&3

Если вам нужен «дружественный» пользовательский ввод, см. этот вопрос о том, как использовать whiptail

0 голосов
/ 02 марта 2010

Если все, что вы хотите, это чтобы пользователь ввел значение, тогда достаточно read:

OLDIFS="$IFS"
IFS=$'\n'
read -p "Enter a value: " -e somevar
IFS="$OLDIFS"
echo "$somevar"
0 голосов
/ 02 марта 2010

если вам нужно получить вывод из функции и сохранить в переменной, вы просто отображаете то, что находится в файле.

open_an_editor()
{
    cat "$1"
}
smth=$(open_an_editor file.txt)
...