Я создаю bash script, который представляет пользователю пользовательскую команду.
Код cli выглядит следующим образом:
#!/bin/bash
cmd1() {
echo $FUNCNAME: "[email protected]"
}
cmd2() {
echo $FUNCNAME: "[email protected]"
}
cmdN() {
echo $FUNCNAME: "[email protected]"
}
__complete() {
echo $allowed_commands
}
shopt -qs extglob
fn_hide_prefix='__'
allowed_commands="$(declare -f | sed -ne '/^'$fn_hide_prefix'.* ()/!s/ ().*//p' | tr '\n' ' ')"
complete -D -W "this should output these words when you hit TAB"
echo "waiting for commands"
while read -ep"-> "; do
history -s $REPLY
case "$REPLY" in
@(${allowed_commands// /|})?(+([[:space:]])*)) $REPLY ;;
\?) __complete ;;
*) echo "invalid command: $REPLY" ;;
esac
done
Уточнение: сделано и протестировано в bash 4
Итак, "read -e" предоставляет возможности чтения, я могу вызвать команды, отредактировать строку ввода и т.д. Что я не могу сделать каким-либо образом, чтобы завершить работу с readline!
Я пробовал две вещи:
-
Как это должно быть сделано: используя bash встроенные функции "complete" и "compgen", о котором сообщается, что здесь Обновление: он не сообщил о работе в скриптах.
Почему строка readline не корректно работает при использовании "полной" внутри script? он работает, когда я пытаюсь использовать его из bash в интерактивном режиме...