~/.bash_profile
выполняется только при запуске оболочки входа в систему.
~/.bashrc
выполняется, когда запущена интерактивная оболочка без входа -.
Чтобы команды выполнялись при открытии нового терминала, вы должны поместить их в ~/.bashrc
.
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
).
Вещи, которые были изменены:
match()
аргументах, как заметил Эд Мортон /.../
для буквального регулярного выражения, не экранируйте +
и удалите неправильное использование\<
(оно не будет соответствовать, потому что -
не находится в «слове», только буквы, цифры, символы подчеркивания )¹ col -b
для устранения обратного шага/перекоса Наблюдаемая ошибка экранирования возникает из-за неправильного порядка 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_-]+\>/
будут работать,изменив \<-
на -\<
, чтобы соответствовать следующим символам слова.