alias: wyodrębnij opcje z polecenia

0

Przepraszamy za zły tytuł. Nie mogłem wymyślić lepszego.

Chcę alias polecenia do innego polecenia i wyodrębnić opcje z tekstu samego polecenia. Zdaję sobie sprawę, że jest to niejasne, więc być może przykład pomoże:

Gdybym miał zrobić coś takiego z tym ls, chciałbym mieć możliwość aliasu następujących elementów:

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

ALE

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

najlepiej chciałbym być w stanie samemu zdecydować, czy zapisać część polecenia, tak jak robię to z sin ls. więc na przykład chciałbym również móc korzystać z grep:

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

nie musimy się teraz martwić o opcje, które przyjmują argumenty, na przykład, jeśli okaże się, że grepmnie działa.

ewok
źródło
Chociaż nie jest to dokładnie to, o co pytasz, chyba że masz polecenie, które często zmienia nazwę polecenia podstawowego, prawdopodobnie łatwiej będzie po prostu ustawić kilka aliasów w swoim .bashrclub podobnym.
Darth Android

Odpowiedzi:

1

Możesz to zrobić, wykonując następujące czynności:

  • Ustaw shopt extdebug, włączając kilka opcji debugowania. Odpowiednia to: Jeśli polecenie uruchomione przez pułapkę DEBUG zwraca wartość niezerową, następne polecenie zostanie pominięte i nie zostanie wykonane. Potrzebujemy tego, aby nie próbować wykonać niezdefiniowanego lalpolecenia.
  • A trapdla DEBUGsygnału, który jest wykonywany przed wykonaniem jakiegokolwiek polecenia. Ustaw pułapkę tak: trap 'insane_magic_alias' DEBUG.

Funkcja insane_magic_aliasanalizuje polecenie, które ma zostać wykonane (in $BASH_COMMAND), i przetwarza je, przerywając wykonanie faktycznie wprowadzonego polecenia w procesie return 1, chyba że typemówi, że istnieje, w tym przypadku nic nie robimy (i nie uruchamiamy).

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

Wynik:

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

Zauważ, że twoja bash myśli, że masz zadanie uruchomione chwilę później (jeśli wydrukujesz w nim informacje o zadaniu PROMPT_COMMAND, zauważysz to). Plus prawdopodobnie jeszcze kilka efektów ubocznych, które powodują, że w każdym razie nie jest to zwykłe demo ...

Daniel Beck
źródło
Prawdopodobnie nie jest to coś, co naprawdę chciałbyś zrobić, jeśli pomyślałeś o możliwych skutkach ubocznych.
Daniel Beck