Как сделать редактируемую строку «echo» редактируемой в сценарии командной оболочки? - PullRequest
4 голосов
/ 30 августа 2011

У меня следующая проблема: в интерактивном скрипте при запросе ввода я хочу отобразить предложение и сделать его редактируемым. Эта функция аналогична «стрелке вверх и редактированию последней команды» в командной строке, за исключением того, что без «стрелки вверх». Я пробовал несколько разных вещей, но пока безуспешно.

Вот что я пробовал:

1) Получить ввод из редактора, вот так:

echo "$SUGGESTION\c"
INPUT=`ed -` # problem with this approach is that 'ed' starts in command mode 
             # by default, and I would need input mode

2) Используйте read -e

echo "$SUGGESTION\c"
read -e INPUT # doesn't work as advertised

После интенсивного поиска в Google я убежден, что 2) должно работать, но это не так. Прежде всего, я не могу удалить $ SUGGESTION, не набрав сначала ввод; после ввода некоторых символов backspace удаляет всю строку, а не только один символ.

Итак, мой вопрос: как заставить работать "read -e" или есть другой подход для решения этой проблемы? Ваша помощь очень ценится!

1 Ответ

4 голосов
/ 30 августа 2011

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

read -e -i "$SUGGESTION" INPUT

К сожалению, это доступно только в Bash 4.

Если у вас есть компилятор C и доступен readline, вот вам быстрый способ взлома. Сохраните следующее в myread.c (или что-то еще) и скомпилируйте его (вам нужно связать с readline). Для GCC это будет: gcc -o myread myread.c -lreadline.

#include <stdio.h>
#include <readline/readline.h>

int main(int argc, char **argv)
{
    if (argc != 2)
        return 1;

    // stuff the input buffer with the default value
    char *def = argv[1];
    while (*def) {
        rl_stuff_char(*def);
        def++;
    }

    // let the user edit
    char *input = readline(0);
    if (!input)
        return 1;
    // write out the result to standard error
    fprintf(stderr, "%s", input);
    return 0;
}

Вы можете использовать это так:

myread "$SUGGESTION" 2> some_temp_file
if [ $? -eq 0 ] ; then 
  # some_temp_file contains the edited value
fi

Много возможностей для улучшения, но я думаю, это начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...