Я пытаюсь создать сценарий завершения Bash для программы Java. Типичный вызов той программы мог бы быть похожим на это:
$ javaProgram -Dproperty=foo option1 option2
Часть моего сценария должна будет предложить различные свойства Java, которые доступны для этой программы (т.е. когда пользователь вводит -D
, сценарий предложил бы, скажем, property=
, разрешение пользователю затем ввести значение).
Я хотел бы, чтобы завершение не вставило пробел после того, как равняется знаку. Однако, когда пользователь вводит различные варианты для программы (option1
и option2
в вышеупомянутом примере), я хотел бы, чтобы сценарий сделал завершение и вставил пробел, когда это завершается.
Я плохо знаком со сценариями завершения Bash, но я знаю nospace
опция для complete
встроенная оболочка. Это, кажется, не работает на compgen
встроенный, тем не менее, который походит на то, что я хочу. Я попытался использовать nospace
, и затем явно включая пробелы в конце подходящих вариантов, но они, кажется, не удаются.
Кто-либо знает, как получить пробелы в конце некоторых опций, но никакие пробелы в конце других?
Деннис прав на деньгах, в функции, на которую вы ссылаетесь с помощью complete -F _your_func
, вам нужно что-то вроде этого (взято из / etc / bash_completion):
# escape spaces; remove executables, aliases, pipes and sockets;
# add space at end of file names
COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
command ls -aF1d "$path*" 2>/dev/null | \
sed -e "s/[][(){}<>\",:;^&!$&=?\`|\\ ']/\\\\\\\\\\\\&/g" \
-e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) )
return 0
В этом конкретном примере используется -o nospace
, но добавляет пробел вручную. Это последний -e ('s / [^ \ /] $ / & / g')
, который добавляет пробел. В этом случае он добавляется только в том случае, если последний параметр не заканчивается косой чертой (это каталог и файлы для автозаполнения).
Ключевым отличием, похоже, является добавление амперсанда перед пробелом. Попробуйте это и посмотрите, работает ли это.
Было бы полезно увидеть имеющийся у вас код.
Однако посмотрите код завершения для scp
в /etc/bash_completion.d/ssh
, если он у вас есть. Он ставит пробелы после имен локальных файлов, но не после имен хостов.