Может ли «bind -x» получить доступ к текущей командной строке?

#bash #readline

#bash #строка чтения

Вопрос:

Когда я набираю какую-либо команду, мне иногда хочется прочитать справку по команде. Например, когда я печатаю

 sort --overwrite some_texI # I is a cursor
  

Я хотел бы проверить, есть ли у sort команды --overwrite опция чтения выходных данных sort --help или любая другая опция-сводка, которую я сделал. Я ожидаю, что bind -x смогу это реализовать, но понятия не имею, как передать (часть) текущей информации командной строки (в данном случае слово «сортировать»). Конечно, bind -x 'KEY: "sort --help"' работает хорошо, но я хочу, чтобы это работало для всех команд. Таким образом, псевдокоманда будет bind -x 'KEY: "CURRENT_COMMAND --help"' .

Кто-нибудь, пожалуйста, может дать решение или подсказку?

Комментарии:

1. @kvantour Вероятно, я этого не хочу. Я уже использую программируемое завершение, и это удобно, но это не говорит мне, например, о значении опции. Как следует из названия моего поста, я хотел бы выполнять произвольные команды, которые используют информацию текущей командной строки. Не только sort --help , но также print_help_summary_created_by_me sort и т.д.

2. Часть вашего вопроса гласит Я хотел бы проверить, имеет ли команда sort параметр —overwrite . Использование хорошего bash-autocompletion позволило бы вам быстро проверить, доступна ли эта опция. Это может не сказать вам, что именно делает опция.

3. Я только что проверил автозаполнение в ZSH (другая оболочка, производная от bash), и там в автозаполнении даже упоминается, о какой опции идет речь.

4. Возвращаясь к теме ZSH, вы можете использовать ESC-q, чтобы поместить текущую команду в стек буферов, что даст вам новую командную строку для запуска sort --help . Когда это завершится, sort --overwrite some_tex будет удален из стека и помещен обратно в командную строку.

5. zsh на самом деле не является производным от bash . Однако у них обоих есть общий предок в оболочке Bourne.

Ответ №1:

Вы можете использовать READLINE_LINE переменную bash. man bash говорит

bind [-m ключевая карта] keyseq:строка чтения-команда

(отрывок)

         -x keyseq: командная оболочка

(отрывок) При выполнении shell-команды оболочка присваивает READLINE_LINE переменной содержимое буфера строки readline

Итак, вам нужно первое слово READLINE_LINE . Таким образом, решение таково bind -x 'KEY": "array=($READLINE_LINE); ${array[0]} --help"' .