Как получить удобство REPL в оболочке unix? (или наоборот)

Я использую много команд, предоставляющих доступ к своего рода API через подкоманды. Например,

git push
bzr push
apt-get install

Через некоторое время мне надоедает писать git push, git commit, git что-то... потому что я знаю единственное, что мне нужно использование для «фиксации», «нажатия» и т. д. в данный момент является git.

Поигравшись с языками, предоставляющими REPL (Ruby, Python и т. д.), мне не хватало удобства набора текста.

$ git pus...           ## arrgh!
$ from git import *
$ push                 ## yes!

Я вижу явную симметрию между такими командами, как git, и пространствами имен или модулями в вышеупомянутых языках программирования.

Итак, вопрос: что нужно для поддержки пространств имен в SHELL? или наоборот, что нужно, чтобы эти языки заменили SHELL?


person protoboolean    schedule 20.07.2011    source источник
comment
Якобы некоторые люди используют perl как интерактивную оболочку. (Я никогда не встречал такого человека.)   -  person William Pursell    schedule 20.07.2011


Ответы (1)


Это было бы чрезвычайно сложно сделать в общем случае. Тем не менее, вы можете приблизить что-то подобное...

#!/usr/bin/env bash

cmd="${1-echo}"

history -r
while read -p"$cmd\$ " -e -r -a input ; do
    history -s -- "${input[@]}"
    "$cmd" "${input[@]}"
done

Вызов с именем команды, например.

./wrapper apt-get

И теперь, когда вы говорите, например. install foo вы фактически выполните apt-get install foo.

Дополнительные улучшения, такие как более интеллектуальное завершение табуляции, возможны, но, безусловно, потребуют кода для конкретной команды.

person sorpigal    schedule 20.07.2011