Одной из полезных функций R является возможность использовать «?<функция>» для быстрого поиска функций без необходимости вводить «справку («<функция>»)».
Можно ли реализовать подобное поведение в оболочке (например, bash или zsh), используя незарезервированный символ?
То есть какая-то команда (без пробела) запускает "man somecommand"
Для этого можно переопределить функцию command_not_found_handle
: см. 3.7.2 Поиск и выполнение команд в руководстве.
Однако, поскольку ?
является специальным символом глобуса, ?ls
можно интерпретировать как команду с именем, скажем, xls
в текущем каталоге. Единственный способ обойти это — отключить подстановку, что явно нарушает такие вещи, как ls *.txt
Я думал о том, чтобы переключить его на такой символ, как Z. Основная привлекательность «?<>» заключается в том, что он находится прямо рядом с клавишей Shift. Таким образом, незарезервированный символ в аналогичной позиции, например. Z, может быть, тоже хорошо.
Возможно, для Баша
command_not_found_handle() {
if [[ $1 != Z* ]]; then
echo "$1: command not found" >&2
return 127
fi
local cmd=${1#Z}
case "$(type -t "$cmd")" in
builtin|keyword) help "$cmd" ;;
file) man "$cmd" ;;
alias) alias "$cmd" ;;
function) type "$cmd" ;;
*) echo "$cmd: command not found" >&2; return 127 ;;
esac
}
Спасибо!. Работает как шарм в bash. Можно попробовать реализовать это в zsh позже.
Дословно:
alias ?=man
, а затем? ls
(есть пробел). Проблема с вашим «без пробела» заключается в том, что он полностью игнорирует предпосылку в сценариях оболочки о том, что команды/аргументы, разделенные пробелами, ... разделены пробелами. Если полный токен не распознается сам по себе... он не распознается. Единственное исключение, о котором я могу думать, это не функция или псевдоним, это ярлык~
homedir, но это все.