Псевдоним: извлечь параметры из команды
Извиняюсь за плохое название. Я не мог придумать лучшего.
Я хочу связать команду с другой командой и извлечь параметры из текста самой команды. Я понимаю, что это неясно, поэтому, возможно, пример поможет:
Если бы я сделал что-то подобное с ls
Я хотел бы иметь возможность псевдоним следующего:
ll -> ls -l
la -> ls -a
lal -> ls -al
l -> ls
НО
ls -> ls #allow this special case to not change
предпочтительно, я хотел бы быть в состоянии самостоятельно определить, следует ли игнорировать часть команды, как я это делаю с s
в ls
, так, например, я также хотел бы иметь возможность делать с grep:
grepi -> grep -i
greps -> grep -s
grepis -> grep -is
нам не нужно сейчас беспокоиться об опциях, которые принимают аргументы, например, хорошо, если grepm
выходит из строя.
1 ответ
Вы можете сделать это используя следующее:
- Задавать
shopt extdebug
, включив несколько вариантов отладки. Соответствующим является следующее: если команда, запускаемая ловушкой DEBUG, возвращает ненулевое значение, следующая команда пропускается и не выполняется. Нам нужно это, чтобы на самом деле не пытаться выполнить неопределенноеlal
команда. trap
дляDEBUG
сигнал, который выполняется перед выполнением любой команды. Установите ловушку так:trap 'insane_magic_alias' DEBUG
,
Функция insane_magic_alias
анализирует команду, которая должна быть выполнена (в $BASH_COMMAND
) и обрабатывает его, прерывая выполнение фактически введенной команды в процессе return 1
если type
говорит, что существует, в этом случае мы ничего не делаем (и позволяем ему работать).
# make sure to name this function appropriately...
function insane_magic_alias {
local CMD=$BASH_COMMAND
# make sure this isn't a command that exists
if ! type "$( echo "$CMD" | awk -F' ' '{ print $1 }' )" >/dev/null 2>&1 ; then
# handle calls to `l*`
if [[ ${#CMD} -gt 1 && "${CMD:0:1}" = l ]] ; then
# actual transformed program call
ls -${CMD:1}
# abort execution of undefined command
return 1
fi
fi
# either execute an existing command, or show the "command not found" message
return 0
}
Результат:
$ lal
total 0
drwxr-xr-x 2 danielbeck staff 68 2 Aug 22:53 .
drwxr-xr-x@ 78 danielbeck staff 2652 2 Aug 22:53 ..
Обратите внимание, что ваш bash думает, что вы выполняете задание на мгновение сразу после этого (если вы печатаете информацию о работе в своем PROMPT_COMMAND
, вы заметите это). Плюс, вероятно, еще несколько побочных эффектов, которые делают это неудачей в любом случае, а не просто демонстрацией...