Jak korzystać z moich aliasów w moim crontabie?

16

Mam w sobie kilka poleceń, .profilektóre chcę wywołać od siebie crontab.

Na przykład, jeśli mam,

alias notify-me="~/bin/notify.pl -u user1"
alias notify-team="~/bin/notify.pl -u user1 user2 user3 user4 ...."

Chciałbym po prostu przywołać alias

0 11 * * * notify-team

więc jeśli moja lista .profilejest zaktualizowana, nie muszę też jej aktualizować crontab. Wydaje mi się jednak, że nie jestem w stanie używać aliasów crontab. Czy jest w pobliżu praca?

Próbowałem tutaj sugestii , aby skonfigurować środowisko (np. / Bin / bash -lc i skrypt-wrapper). Wygląda na to, że działa to dla skryptów, ale nie dla aliasów.

Jakieś pomysły?

Keith Bentrup
źródło
Dzięki wszystkim za przydatne informacje. Kilka możliwych rozwiązań, w tym moje własne. Ostatecznie zmodyfikowałem oryginalny pomysł artifexu na coś bardziej przydatnego w mojej sytuacji. Chris dostarczył niezbędne informacje, aby zrobić to z osobnymi skryptami.
Keith Bentrup,

Odpowiedzi:

10

Z strony podręcznika dotyczącej aliasów:

Uwaga: aliasy nie są domyślnie rozwijane w powłoce nieinteraktywnej,
i można to włączyć, ustawiając opcję „expand_aliases”
opcja powłoki za pomocą shopt.

Więc spróbuj użyć shopt -s expand_aliasesna początku skryptu pozyskiwania. To powinno pozwolić ci skorzystać z sugestii Warnera.

Christopher Karel
źródło
To jest dla mnie domyślnie włączone w CentOS5. Fajna notatka.
Warner
Prawdopodobnie nie w skrypcie. Spróbuj utworzyć skrypt testowy, który wyświetla dane wyjściowe shopt expand_aliases. Założę się, że to wyłączone. Jest w moim pudełku RHEL 5.3.
Christopher Karel,
Trafiłeś w gwóźdź. +1
Warner
+1 Thx za zwrócenie na to uwagi. To pozwala mi w większości przypadków znaleźć rozwiązanie, ale wciąż muszę utworzyć inny plik. Miałem nadzieję, że zrobię to bez tego.
Keith Bentrup,
Keith, miałem ten sam problem, ale eval 'foo'załatwienie sprawy w crontab załatwiło sprawę .
Artem Russakovskii
6

bash -c z „source” powinien działać:

0 11 * * * bash -c "source .profile && notify-team"

to może również działać. okres oznacza „źródło”

0 11 * * * . .profile && notify-team
Collin Anderson
źródło
3

Jak zidentyfikował Chris, domyślną opcją powłoki dla powłok nieinteraktywnych jest brak rozwijania aliasów. Oto rozwiązanie, które znalazłem do pracy.

Napisz skrypt, włącz opcję powłoki i pozyskaj aliasy. Zwróć szczególną uwagę, że .bashrcjest on pozyskiwany podczas wykonywania, dlatego należy go ponownie uzyskać po włączeniu opcji expand_aliases.

Przepraszam za początkowo niepoprawne zalecenie. To było bardziej niejasne, niż początkowo się spodziewałem.

Scenariusz:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team
Warner
źródło
Dzięki, ale już tego próbowałem. Czy możesz potwierdzić, że działa w twoim systemie? Próbowałem także / bin / bash -lc source ~ / .profile; zespół powiadomień i inne odmiany. Wolę też nie mieć osobnego skryptu dla każdego aliasu. To przeczy celowi unikania powielania.
Keith Bentrup,
Powinienem był dołączyć błąd z crontab: „nie znaleziono polecenia” dla każdej odmiany, której próbowałem.
Keith Bentrup,
Edytowane z przetestowanym zaleceniem.
Warner
Dzięki za zaktualizowany przykład. Myślę, że jeśli dodasz -l do pierwszej linii, możesz pozbyć się trzeciej.
Keith Bentrup,
Ach, dobra rozmowa - powłoka logowania miałaby włączone expand_aliases.
Warner
1

Podoba mi się pomysł artifexu, aby pobrać alias z pliku, a następnie użyć go ponownie, ponieważ nie mogłem znaleźć sposobu na bezpośrednie rozwinięcie / ponowne użycie aliasów. (Inne rozwiązania nadal wymagały innego skryptu).

Więc napisałem tę funkcję i umieściłem ją w moim .profile:

grab-alias () { sed -n '/alias\s*'$1'\s*=/ {s/[^'\'']*.//;s/'\''\s*$//p}' /home/bentrupk/.profile; }

Potem mogłem użyć go w moim crontabie do różnych aliasów:

0 11 * * * /bin/bash -lc 'x=`grab-alias notify-team`; $x'
0 7 * * * /bin/bash -lc 'x=`grab-alias notify-me`; $x'

itp.

Tak, ponowne użycie kodu! Dziękuje wszystkim.

Keith Bentrup
źródło
3
to jest czyste zło.
Justin
Gdybym mógł użyć aliasu bezpośrednio, zrobiłbym to. To jest sedno pytania. Możesz zaproponować inne rozwiązanie, ale wezmę to rozwiązanie na wiele 2-3 plików liniowych zaśmiecających katalog - co się stanie, gdy dodam dodatkowe schematy powiadomień lub zdecyduję się użyć niektórych innych moich aliasów.
Keith Bentrup,
1

Naprawdę najprostszą rzeczą, jaką możesz zrobić, to stworzyć

~ / bin / powiadom mnie za pomocą

#!/bin/sh
~/bin/notify.pl -u user1

~ / bin / powiadom-zespół z

#!/bin/sh
~/bin/notify.pl -u user1 user2 user3 user4 ....

aliasy powłoki są skomplikowane w utrzymaniu i integracji z innymi systemami, jak widzieliście. najlepiej jest zmienić je w pełnoprawne polecenia, które nie będą miały zabawnych problemów ze środowiskiem.

Justin
źródło
1
Dziękuję za sugestie, ale nigdy nie myślałem, że aliasy były trudne do utrzymania i wolałbym zachować 1 plik aliasów, a następnie przechowywać wiele plików otoki. Problem polegał na wykonywaniu aliasów w zadaniu cron.
Keith Bentrup,
0

bash -ic „powiadom-zespół” jest najlepszą opcją. Udostępnia alias w crontab. Możesz dodatkowo dodać tło dla &, ponieważ używamy powłoki „interaktywnej” z -i, ale w rzeczywistości nie wchodzimy w interakcję z nią.

SuperGeek
źródło
-2
0 11 * * * bash -ic "notify-team" > /log/file

pracuje dla mnie

vakhrymchuk
źródło
1
Niektóre wyjaśnienia poprawiłyby odpowiedź
Dave M