obserwuj rozwijanie aliasu poleceń


67

Jeśli uruchomisz watchpolecenie zawierające alias, nie rozwinie ono aliasu. Próbowałem zarówno z pojedynczym cytatem, jak i podwójnym cytatem, w rzeczywistości biorąc pod uwagę następujący alias:

# alias ll
alias ll='ls -l --color=tty'

Następujące polecenie zakończy się niepowodzeniem

# watch ll
sh: ll: command not found

Czy w tym przypadku rozszerzenie wiersza poleceń nie powinno działać?

Odpowiedzi:


98

Aliasy są rozwijane tylko jako pierwszy argument lub po innym aliasie ze spacją na końcu polecenia.

Z bash„s help alias:

Końcowa spacja w WARTOŚCI powoduje, że następne słowo jest sprawdzane pod kątem zastępowania aliasu po rozwinięciu aliasu.

Aby to zrobić, spróbuj wykonać następujące czynności:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

Należy pamiętać, że niektóre wersje watchkolorów pasków domyślnie, w niektórych wersjach można to zatrzymać za pomocą --colorlub -G.


1
To absolutnie niesamowita odpowiedź! Dzięki i oczywiście +1.
— ztank1013,

1
Dzięki ... Przez cały ten czas zwykłem 1. pisać ll, 2. naciskać ctrl + alt + e, 3. następnie oglądać prefiks. To oszczędność czasu.
— anishsane

10
Niestety, ta metoda ma ograniczenie, którego nie można podać, watchponieważ alias musi być następnym słowem, podczas gdy watchdo uruchomienia polecenia potrzebne są argumenty. Jeśli spróbujesz watch -n 10 <alias>, bash nie rozwinie aliasu. Aby obejść ten problem, potrzebujesz aliasu zawierającego żądane opcje (np. `Alias ​​watch-10 = 'watch -n 10'), wciąż ze spacją końcową.
— indyw

2

Może moglibyśmy ręcznie rozwinąć alias, zanim obejrzy go zegarek?

watch $(alias ll | cut -d\' -f2)

Wyjaśnienie

Wyjście alias llwygląda następująco:

$ alias ll
alias ll='ls -lAGh'

Ustawiamy więc ogranicznik cięcia jako pojedynczy cudzysłów i przecinamy drugie pole, pozostawiając:

ls -lAGh

tzn. rozszerzony alias. To następnie tworzy argumenty podane watch.

Zrób funkcję, aby to zrobić

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

Następnie,

watcha ll

działa zgodnie z życzeniem. To jest okropne i zawiedzie we wszystkich sytuacjach. Przepraszam.


0

Myślałem, że tutaj podstawowym problemem jest podczas wykonywania watch, argumentem jest „ sh -c”, co oznacza, że ​​jeśli alias llnie jest zdefiniowany w sh(dash shell's)środowisku, to go nie rozwinie. Ale myliłem się i tak nie jest, powyższa odpowiedź Chrisa jest słuszna.


2
Nie dokładnie. Spróbować watch 'alias ll="ls -l --color=tty"; type ll; ll'.
— Chris Down,

+1 za natychmiastową odpowiedź w celu weryfikacji. Myliłem się powyżej.
— Sachin Divekar

@ChrisDown, więc nawet jeśli zegarek używa „ sh -c”, twoje wyjaśnienie ma również zastosowanie sh. Czy mam rację?
— Sachin Divekar

1
To zależy od tego, jak używana jest powłoka sh. Zauważ, że to robi pracę:sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
— Chris dół

0

Uruchom watchnową interaktywną powłokę, która rozszerzy alias:

watch -x bash -i -c ll

(Ma -xon na celu powstrzymanie się watchod używania własnego sh -cdo zawijania naszego podanego polecenia. Nie chcemy tego, ponieważ musimy przekazać -ido shlub bash, aby uczynić ją interaktywną powłoką, która odczytuje .bashrc i definiuje aliasy. Za pomocą -x, watch wykonuje polecenie za pomocą exec.)

W rzeczywistości to nie działa. Po jednorazowym wyświetleniu wyniku „ll”, a następnie przespaniu 2 sekund, zadanie zostaje w tle, z nieco enigmatycznym:

1]+  Stopped                 watch -x bash -i -c ll

Dlaczego to się skończyło? Gdzie [poszła otwarta orteza ? Cholera, myślałem, że to świetna odpowiedź, ale nie mogę sprawić, żeby zadziałała.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.