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ć?

ztank1013
źródło

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.

Chris Down
źródło
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.

Jonathan Hartley
źródło
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.

Sachin Divekar
źródło
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.

Jonathan Hartley
źródło