Вывести вывод сценария bash в строку, которая называется сценарием bash

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

Лучший пример, который я могу использовать для описания того, что я ищу, – это функция завершения, которая запускается при нажатии [TAB]:

$ech[tab] #--> $echo 

Я должен отметить, что #--> должен был представлять, как завершение закончилось словом «эхо».

Самое близкое, что мне удалось найти, это установить определенные опции для «эха», чтобы можно было читать \b\b , а stdout может обновлять одну и ту же строку. Но это не то, что я ищу. Я хотел бы иметь возможность выводить непосредственно на текущую или следующую строку на вкладке консоли. Возможно ли это из сценария bash?

Редактировать:

Спасибо всем, кто ответил. Я чувствую, что должен обновить свой первоначальный вопрос и, возможно, изменить сам заголовок вопроса.

Объем моего вопроса изменился следующим образом: это уже не вопрос о том, что я могу или не могу выполнить только с помощью сценариев. Моя первоначальная цель состояла в том, чтобы подражать функции «Завершение», которую я начал изучать, на самом деле является встроенной командой bash .

Кажется, что конкретная библиотека, на которую я должен обратить внимание (для того, чтобы даже начать пытаться подражать команде tab-completion bash), является библиотека Readline . Само пополнение bash было реализовано в C (++?).

В любом случае, еще раз спасибо за проницательные ответы, и если у кого-то есть советы, кроме того, что указано в вышеупомянутой статье (возможно, от личного использования библиотек Readline или Completion), я с нетерпением жду ваших комментариев.

  • Как проверить нулевые поля в CSV-файле?
  • В чем смысл $? в сценарии оболочки?
  • дождитесь выхода хрома, прежде чем продолжить сценарий оболочки
  • Как переименовать несколько файлов, добавив общую строку в начале файлов?
  • Передавать команды сценарию, который ждет ввода на машине Linux
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • задайте файл, найдите, где в подкаталоге он был скопирован в
  • Что означает '-size +0' в команде 'test'
  • One Solution collect form web for “Вывести вывод сценария bash в строку, которая называется сценарием bash”

    Есть два способа интерпретировать этот вопрос: кажется, вы либо хотите перезаписать то, что уже было написано на терминале, с чем-то другим, что довольно легко сделать, или же вы хотите программно подавать текущий ввод интерактивной оболочки.

    Дело в том, что эти вопросы в конечном счете означают две совершенно разные вещи. Ошибка, которую многие люди делают (я, конечно же, все равно – неоднократно) , должен приравнивать визуальные символы, напечатанные на экране терминала, с помощью ввода, введенного на клавиатуре, как одного и того же. По правде говоря, клавиатура гораздо проще обрабатывать, чем выход на экране – между ними происходит много работы, чтобы преобразовать первую в последнюю. Распечатка на терминале является удобством – и она часто лежит.

    Если вы хотите подавать ввод в оболочку, то запись на экран, вероятно, не поможет вам. Вы можете это сделать, конечно, испускание стандартной последовательности VT102 + escape для перемещения по терминальной линии может выглядеть так:

     printf '\033[A' 

    … но если вы это сделаете, это не будет выглядеть так, как будто это произошло – и это потому, что оболочка не читает это – он пишет в том же месте, где вы. Ты можешь сделать:

     printf '\033[A'; cat 

    … на самом деле увидеть, что он делает, потому что cat не позволит оболочке немедленно рисовать новое приглашение. Вы можете (возможно) добавить числовой параметр между [ скобкой и A для нескольких строк. Вы можете спуститься с помощью B , слева от D , а справа – с C Сохранение вывода tput вызванного последовательностями termcap которые вы можете найти в man termcap для названных переменных, обычно является тем, как люди идут, хотя и правильно. Терминалы – забавные вещи.

    Если вы хотите повеселиться, вы можете попробовать:

     stty raw isig -echoctl; cat >/dev/null 

    На xterm совместимом терминальном эмуляторе (при условии, что stty поддерживает -echoctl но если это не так, вам все равно это не понадобится), который должен в основном позволить вам -echoctl по всему экрану терминала с помощью клавиш со стрелками и набирать поверх любого из текст там. Но ничто из этого не имеет большого значения, потому что вы переписываете дисплей – оболочка вообще этого не волнует.

    Если вы хотите повлиять на оболочку, вам нужно поговорить со своим stdin. Интерактивная оболочка, как правило, не прислушивается к тому, что вы должны говорить на этом фронте, если вы не сообщите ее заранее – когда вы ее вызываете. В противном случае он просто будет слушать клавиатуру – вот для чего это (точнее, вернее, клавиатура – это stdin) . Но у вас есть варианты.

    Хорошим способом сценария ввода интерактивной оболочки является ее задержка. Например, вы можете получить фиктивный запрос – тот, который будет практически ничего не делать, кроме приема на клавиатуре и эха, что для stderr :

     sh -niv 2>&1 >/dev/null | ... 

    Это тоже не должно быть ваш /bin/sh – он отлично работает для bash или чего-то еще. bash будет делать все типичные readline – даже историю команд и $PS1 – но он выполнит -n othing и -временит всю запись в трубу. Затем вы можете направить его, как вам угодно, – возможно, через другую трубу в другую bash после небольшой фильтрации.

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

    Linux и Unix - лучшая ОС в мире.