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

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

Если бы я делал что-то подобное с 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 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .