Używam Ubuntu 10.04 i używam upstart
do zarządzania demonem. Moja aplikacja korporacyjna jest uruchamiana jako demon i musi być uruchamiana jako root z powodu różnych uprawnień. Na przykład:
sudo start my-application-long-ID
sudo stop my-application-long-ID
etc
Chciałbym wprowadzić alias
skrót do tych poleceń jako coś w stylu:
alias startapp='sudo start my-application-long-ID'
i uruchom go jak startapp
i to działa, ale wolałbym nie mieć sudo w aliasie.
alias startapp='start my-application-long-ID'
nie działa po uruchomieniu sudo startapp
, powrót sudo: startapp: command not found
.
Jednak gdy dodałem alias:
alias sudo='sudo '
sudo startapp
teraz działa, ale wciąż jestem ciekawy, dlaczego sudo ignoruje aliasy.
source ~/.bashrc
? To aktualizuje plik .bashrc i udostępnia nowe aliasy?Odpowiedzi:
Widzę stąd poniższe informacje .
Podczas korzystania z sudo użyj rozszerzenia aliasu (w przeciwnym razie sudo ignoruje twoje aliasy)
Wyjaśniono tutaj powód, dla którego to nie działa .
źródło
Aliasy i funkcje są zdefiniowane w powłoce. Sudo to program zewnętrzny. Zatem sudo nie widzi aliasów, funkcji ani wbudowanych powłok, tylko polecenia zewnętrzne.
Aliasy mają być alternatywnymi nazwami poleceń, więc powłoki rozszerzają je tylko w pozycji poleceń, a nie wtedy, gdy są argumentami poleceń. Zsh obsługuje globalne aliasy, które są rozwijane w dowolnym miejscu wiersza poleceń, i najlepiej używać oszczędnie, ponieważ istnieje ryzyko ich przypadkowego rozwinięcia nawet w kontekstach, w których alias nie ma sensu.
Można powiedzieć sudo wywołać powłokę:
sudo sh -c '…shell command here…'
. Zwykłe aliasy nie będą jednak dostępne w tym poleceniu powłoki, ponieważ zwykle są przechowywane w pliku takim jak~/.bashrc
lub,~/.zshrc
który jest odczytywany tylko przez interaktywne powłoki.alias sudo='sudo '
, jak zaproponował Ramesh , powoduje, że powłoka rozwija później aliasysudo
.źródło
alias sudo='sudo '
działa również dla ZSH?Rozwiązanie dla użytkowników Zsh
Zarówno w bash, jak i zsh zakończenie aliasu spacją spowoduje, że powłoka alias rozszerzy następne słowo. Pozwala to na rozwinięcie aliasu w następujący sposób
myalias
Niestety rozpada się, gdy w aliasie znajduje się więcej niż jedno słowo (np
sudo -u someone
. Można jednak użyć funkcji „globalne aliasy” zsh do ręcznego rozwijania aliasów w dowolnym miejscu polecenia.Tworzy to globalny alias o nazwie
$
(możesz użyć dowolnego słowa), który kończy się spacją. Powoduje to, że zsh rozwija następne słowo jako zwykły alias polecenia. Ponieważ alias rozwija się do białych znaków, nie będzie traktowany jako argument. Umożliwia to działanie następujących elementów.Możesz nawet użyć
$
wiele razy w jednym wierszu poleceń, jeśli masz skomplikowane zagnieżdżanie poleceń. Znalazłem to na tyle przydatne, że ma stałe miejsce w moim Zshrc, jednak alias jest wystarczająco prosty, aby określić, kiedy trzeba go użyć.źródło
Podałem tutaj alternatywną odpowiedź bez redefiniowania
sudo
za pomocą aliasu.W twoim przypadku byłoby to:
Wszystko w jednym wierszu, bez dodatkowych powłok, bez redefiniowania aliasów. ;-)
źródło
xargs
do rozebrania cytatów, a grep do rozebrania wiodących=
. Trochę sprytne, ale prawdopodobnie niepotrzebne.eval "sudo $(alias aliasname | cut -d= -f2-)"
jest prawdopodobnie lepszy -xargs
nie zawsze będzie poprawnie obsługiwał cytatów i może być ich więcej niż jeden=
.xargs
nie usuwaj cytatów. To grep bierze rozstrzygnięte polecenie między cudzysłowami. Wiesz,type -a alias_name
zwraca coś takiegoalias_name is aliased to command_within_quotes
. Nawiasem mówiąc, wypróbowałem twoje polecenie i nietype -a
type
robibash
. Rozumiesz jednak, że cytaty są podwojone, prawda? Czy próbowałeś tego z aliasem zawierającym pojedyncze cytaty? W każdym razie, masz rację o moje rzeczy nie działa - trzeba alboeval "sudo sh -c "$(...
alboeval "'sudo $(alias alias_name| cut -d\' -f2-)"
. Chodzi o to, żealias
są to w zasadzie wstępnie skonfigurowaneeval
s -alias
narzędzie jest wyspecyfikowane, aby wyświetlało zawartość, aby można ją było bezpiecznie ponownie wprowadzić do powłoki. Myślę, że twojaxargs
implementacja jest wtedy spłaszczona do białych znaków? Bądź z tym ostrożny, dobrze?