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 s
in 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 grepm
nie działa.
.bashrc
lub podobnym.Odpowiedzi:
Możesz to zrobić, wykonując następujące czynności:
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ć niezdefiniowanegolal
polecenia.trap
dlaDEBUG
sygnału, który jest wykonywany przed wykonaniem jakiegokolwiek polecenia. Ustaw pułapkę tak:trap 'insane_magic_alias' DEBUG
.Funkcja
insane_magic_alias
analizuje polecenie, które ma zostać wykonane (in$BASH_COMMAND
), i przetwarza je, przerywając wykonanie faktycznie wprowadzonego polecenia w procesiereturn 1
, chyba żetype
mówi, że istnieje, w tym przypadku nic nie robimy (i nie uruchamiamy).Wynik:
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 ...źródło