如何从bash函数打开编辑器?

时间:2010-03-02 05:58:47

标签: linux bash nano

我有一个简单的功能来打开编辑器:

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 个答案:

答案 0 :(得分:2)

如果您需要的输入是已修改的文件,那么在您执行cat filename

后,您显然需要open_an_editor filename

如果你确实需要编辑器的输出,那么你需要交换stderr和stdin,即: nano "$1" 3>&1 1>&2 2>&3

如果您需要“友好”的用户输入,请参阅this question了解如何使用whiptail

答案 1 :(得分:0)

如果您需要从函数输出并存储在变量中,您只需显示文件中的内容。

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

答案 2 :(得分:0)

如果你想要的只是让用户输入一个值,那么read就足够了:

OLDIFS="$IFS"
IFS=$'\n'
read -p "Enter a value: " -e somevar
IFS="$OLDIFS"
echo "$somevar"