Я хотел бы программно поместить определенный фрагмент текста в буфер командной строки bash, прочитать для редактирования и использовать в качестве команды.
Я с нетерпением жду чего-то похожего read -i
на команды.
-i text
Если readline используется для чтения строки, текст помещается в буфер редактирования перед началом редактирования.
Изменить : Под программно я подразумеваю, что хочу написать это в скрипте , запустить скрипт и подготовить буфер команд или изменить историю команд (как предлагалось в некоторых вопросах).
screen
может сделать это для вас.Ответы:
Я нашел хакерский способ сделать это на странице примеров fzf . Это работает с bash 4.3 и perl 5.18:
Он выводит команду на стандартный вывод, но также копирует ее в буфер команд. На связанной странице также есть пример, если вы хотите выполнить команду напрямую.
источник
&TIOCSTI
немного лучше, чем0x5412
тоже. Стоит отметить, что это звучит так, как будто некоторые платформы (например, OpenBSD ) отключают TIOCSTI. Я думаю, это означает, что и этот подход, и zshprint -z
не сработают.Если это для функции, которую вы собираетесь использовать в привязке readline,
bind -x
то вы можете изменитьREADLINE_LINE
. ( Пример )Вне привязки readline, вы можете вставить поддельную команду в историю с помощью
history -s
.источник
history -s 'foo'
в скрипте, история запущенной оболочки не изменяется вообщеsource
). Вы не можете ничего сделать из отдельного процесса.Ответ Жиля правильный, но не полностью удовлетворительный. Когда я читаю этот вопрос, ОП хочет «отобрать» следующую строку ввода. В моем случае я хотел прочитать текущую позицию терминала в моей функции PROMPT_COMMAND. Это работает, но использует тот же буфер чтения, что и первичная оболочка, и поэтому любой пользовательский ввод отбрасывается тем фактом, что я сделал встроенный вызов read для функции. Поэтому я хотел прочитать пользовательский ввод отдельно, выполнить чтение с моего терминала, а затем поместить ввод для чтения обратно в буфер ввода, что является первоначальным вопросом. Обратите внимание, что это действительно в том же процессе, поэтому теоретически это должно быть возможно.
Насколько я вижу (на моем bash 4.2) нет функции, чтобы программно что-то помещать в стек ввода. В zsh используется 'print -z'.
Ответ таков: в bash это невозможно, для этого нужно использовать zsh.
источник
Как альтернатива
history -s 'foo'
попробовать:источник