Запрос параметров команды со страницы руководства

~/.bash_profileвыполняется только при запуске оболочки входа в систему.

~/.bashrcвыполняется, когда запущена интерактивная оболочка без входа -.

Чтобы команды выполнялись при открытии нового терминала, вы должны поместить их в ~/.bashrc.

2
29.09.2019, 18:13
1 ответ
man ls | col -bx | nawk '
{
    for (ii=1;ii<=NF;ii++) {
        if ( match($ii,/^(-[a-zA-Z0-9]|--[a-zA-Z0-9-]+)/) )
            opt[substr($ii,RSTART,RLENGTH)]++
     }  
} 
END { for (oo in opt) printf("%s\n",oo)  } '

Это должно работать в любом "новом" awk (nawk, mawk,gawk).

Вещи, которые были изменены:

  1. имя переменной цикла и выключено -на -одна ошибка
  2. неправильный порядок в match()аргументах, как заметил Эд Мортон
  3. используйте /.../для буквального регулярного выражения, не экранируйте +и удалите неправильное использование\<(оно не будет соответствовать, потому что -не находится в «слове», только буквы, цифры, символы подчеркивания )¹
  4. проход через трубу col -bдля устранения обратного шага/перекоса
  5. сохранить все наблюдаемые параметры в массиве, чтобы исключить дублирование на выходе

Наблюдаемая ошибка экранирования возникает из-за неправильного порядка match()аргументов, "<" в литеральной строке не нужно и не следует экранировать. Только \<в регулярном выражении (с правильными /.../разделителями )имеет особое значение. Если регулярное выражение представляет собой литеральную «строку» или переменную, то вы используете "\\<"в литеральной строке, чтобы представить \<в регулярном выражении.

Пакет bash -завершения имеет функцию, которая делает что-то похожее на вашу цель, его функция _longoptвызывает команду с --helpдля создания завершения на лету, в конечном итоге используя что-то вроде:

compgen -W "$( LC_ALL=C $COMMAND --help 2>&1 | \
  sed -ne 's/.*\(--[-A-Za-z0-9]\{1,\}=\{0,1\}\).*/\1/p' | sort -u )"

Вы также можете найти реализацию (perl )изhelp2manпоучительной, она обрабатывает вывод " command --help" или аналогичный для создания минимальной справочной страницы.


¹ \<и\>нулевые -утверждения ширины не являются -POSIX и сейчас редко используются в PCRE \b(?<=\W)и \b(?=\W). Поддержка в gawk— это GNU -изм, хотя и не задокументированный как таковой. Сопоставление Solaris ERE также поддерживает их, хотя его awkнет — там они также могут соответствовать началу или концу строки, поэтому работают как задумано (, т.е. с/usr/xpg4/bin/grep -E).

Они не соответствуют началу/концу строки в GNU awk, но /-\<[0-9a-zA-Z_-]+\>/будут работать,изменив \<-на -\<, чтобы соответствовать следующим символам слова.

0
18.02.2020, 11:28

Теги

Похожие вопросы