Псевдоним: извлечь параметры из команды

Извиняюсь за плохое название. Я не мог придумать лучшего.

Я хочу связать команду с другой командой и извлечь параметры из текста самой команды. Я понимаю, что это неясно, поэтому, возможно, пример поможет:

Если бы я сделал что-то подобное с 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, вы заметите это). Плюс, вероятно, еще несколько побочных эффектов, которые делают это неудачей в любом случае, а не просто демонстрацией...

Другие вопросы по тегам