2010-03-02 2 views
2

У меня есть простая функция, чтобы открыть редактор:Как открыть редактор из функции bash?

 
open_an_editor() 
{ 
    nano "$1" 
} 

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

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

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

+1

Какой именно результат вы ожидаете от редактора? –

+0

что вы пытаетесь сделать? сделайте это более ясным – ghostdog74

+0

Я думаю, что вы имели в виду значение A \. Вы можете использовать 'tr', чтобы избежать пробелов, прежде чем передавать его в ваш редактор по выбору. Это не редактор, его VFS и основная файловая система. Пространства так же приемлемы, как и пробелы, когда дело доходит до имен файлов, но их нужно избегать. tr '' '\' может быть началом. –

ответ

2

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

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

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

+0

Большое спасибо! Что я должен делать, чтобы понять, что именно происходит в этом обмене? :) –

+1

Подкачка похожа на 'tmp = a; a = b; b = tmp; 'операторов для обмена значениями' a' и 'b'. Здесь дескриптор 3 файла является 'tmp', а 1, 2 -' a', 'b'. 1 - stdout, 2 - stderr. –

+1

Дополнение к комментарию от @Alok - 0,1,2 - это предопределенные дескрипторы __file__, которые указывают на стандартный ввод, вывод и ошибку (соответственно) - другие дескрипторы файлов в общем случае «сгенерированы», вызывая функцию open() на языке программирования , Тем не менее, в примере подкачки fd 3 - направляется в fd 1 и, следовательно, может использоваться без ссылки на них http://en.wikipedia.org/wiki/File_descriptor В качестве бонуса вы можете увидеть «уже используемые» файловые дескрипторы в текущей оболочке «ls/proc/$$/fd» – Kimvais

0

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

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

Если все вы хотите для нас er ввести значение, то read достаточно:

OLDIFS="$IFS" 
IFS=$'\n' 
read -p "Enter a value: " -e somevar 
IFS="$OLDIFS" 
echo "$somevar" 
Смежные вопросы