Помістіть текст у буфер командного рядка bash


9

Я хотів би програмно помістити певний фрагмент тексту в буфер командного рядка bash, прочитати для редагування та використовувати як команду.

Я з нетерпінням чекаю щось подібне, read -iале не для команд.

-i text Якщо для читання рядка використовується лінія для читання, текст розміщується в буфері редагування перед початком редагування.

Редагувати : Під програмою я маю на увазі, що хочу написати це в сценарії , запустіть скрипт і підготуйте буфер команд або змініть історію команд (як підказують деякі запитання).


IIRC screenможе зробити це за вас.
strugee

Відповіді:


6

На сторінці прикладів fzf я знайшов хакітний спосіб зробити це . Це працює з bash 4.3 та perl 5.18:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

Він виводить команду stdout, але також копіює її в буфер команд. На пов’язаній сторінці також є приклад, якщо ви хочете виконати команду безпосередньо.


Ця відповідь є найближчою до того, що просив ОП.
reza.safiyat

Трохи відрізняється синтаксис в цій відповіді , &TIOCSTIце трохи краще , ніж 0x5412занадто. Варто зазначити, що це здається, що деякі платформи (наприклад, OpenBSD ) відключають TIOCSTI. Я думаю, що це означає, що і цей підхід, і zsh не print -zбудуть працювати.
dimo414

4

Якщо це для функції, з якою ви збираєтесь використовувати в прив'язці рядка читання, bind -xто ви можете змінити READLINE_LINE. ( Приклад )

Поза прив'язкою читання рядків ви можете натиснути на історію підроблену команду на історію history -s.


Проблема полягає в тому, що якщо я роблю history -s 'foo'сценарій, історія запущеної оболонки зовсім не змінюється
gioele

@gioele Ви повинні запустити його з оболонки (наприклад, із сценарію, який ви завантажуєте source). Ви не можете нічого зробити з окремого процесу.
Жил "ТАК - перестань бути злим"

2

Відповідь Жиля правильна, але не повністю задовольняє. Коли я читаю це питання, ОП хоче "заздалегідь" встановити наступний рядок введення. У моєму випадку я хотів прочитати поточну позицію терміналу у своїй функції PROMPT_COMMAND. Це працює, але використовує той самий буфер читання, що і основний оболонку, і тому будь-який вхід користувача відкидається через те, що я зробив вбудований виклик 'read' у функції. Тому я хотів прочитати вхід користувача окремо, зробити свій термінал читанням, а потім покласти прочитаний вхід назад у вхідний буфер, що є початковим питанням. Зауважте, що це дійсно в межах одного процесу, тому теоретично це повинно бути можливим.

Наскільки я бачу (на моєму баш 4.2) немає функції програмного підштовхування чогось до вхідного стеку. У zsh є використання 'print -z'.

Отже, відповідь така: це неможливо в bash, для цього потрібно використовувати zsh.


0

Як альтернатива history -s 'foo'спробувати:

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.