alias: extrai opções do comando

0

Desculpas pelo mau título. Eu não consegui pensar em um melhor.

Eu quero alias um comando para outro comando e extrair opções do texto do comando em si. Eu percebo que isso não está claro, então talvez um exemplo ajude:

Se eu fizesse algo assim com ls , gostaria de poder alias o seguinte:

ll -> ls -l
la -> ls -a
lal -> ls -al
l -> ls

MAS

ls -> ls #allow this special case to not change

de preferência, eu gostaria de ser capaz de determinar por mim mesmo se quer ignorar parte do comando, como eu faço com o s in ls . Então, por exemplo, eu também gostaria de poder fazer com o grep:

grepi -> grep -i
greps -> grep -s
grepis -> grep -is

nós não temos que nos preocupar agora sobre opções que levam argumentos, por exemplo, é ok se grepm falhar.

    
por ewok 02.08.2012 / 22:03

1 resposta

1

Você pode fazer isso usando o seguinte:

  • Defina shopt extdebug , ativando várias opções de depuração. O relevante é: Se o comando executado pela armadilha DEBUG retornar um valor diferente de zero, o próximo comando será ignorado e não executado. Precisamos que isso não tente realmente executar o lal indefinido. comando.
  • Um trap para o sinal DEBUG , que é executado antes de qualquer comando ser executado. Defina a armadilha assim: trap 'insane_magic_alias' DEBUG .

A função insane_magic_alias interpreta o comando prestes a ser executado (em $BASH_COMMAND ) e o processa, abortando a execução do comando realmente inserido no processo por return 1 , a menos que type diga que existe, nesse caso caso não façamos nada (e deixe correr).

# 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
}

Resultado:

$ 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 ..

Observe que o seu bash acha que você tem um trabalho em execução por um momento logo depois (se você imprimir as informações do trabalho no seu PROMPT_COMMAND , você notará isso). Além disso, provavelmente, alguns outros efeitos colaterais que fazem isso falhar em qualquer caso, não apenas uma simples demonstração ...

    
por 02.08.2012 / 22:55