Wie verwende ich meine Aliase in meiner Crontab?

16

Ich habe einige Befehle in meinem .profile, die ich von meinem aufrufen möchte crontab.

Zum Beispiel, wenn ich habe,

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

Ich möchte nur den Alias ​​aufrufen

0 11 * * * notify-team

Wenn die Liste in meinem .profilealso aktualisiert wird, muss ich sie auch nicht aktualisieren crontab. Ich scheine jedoch nicht in der Lage zu sein, Aliase in meinem zu verwenden crontab. Gibt es eine Abhilfe?

Ich habe die Vorschläge hier ausprobiert , um die Umgebung einzurichten (z. B. / bin / bash -lc und das Skript-Wrapper-Skript). Es scheint so, als ob das für Skripte funktioniert, aber nicht für Aliase.

Irgendwelche Ideen?

Keith Bentrup
quelle
Vielen Dank für die nützlichen Infos. Einige mögliche Lösungen hier, einschließlich meiner eigenen. Letztendlich habe ich die ursprüngliche Idee von artifex in etwas geändert, das für meine Situation nützlicher ist. Chris lieferte die notwendigen Informationen, um dies mit separaten Skripten zu tun.
Keith Bentrup

Antworten:

10

Aus der Manpage zu Aliasen:

Hinweis: Aliase werden in der nicht interaktiven Shell nicht standardmäßig erweitert.
und es kann durch Setzen der 'expand_aliases' aktiviert werden
Shell-Option mit shopt.

Versuchen Sie es shopt -s expand_aliasesam Anfang Ihres Sourcing-Skripts. Dies sollte es Ihnen ermöglichen, Warners Vorschlag zu verwenden.

Christopher Karel
quelle
Dies ist für mich auf CentOS5 standardmäßig aktiviert. Coole Notiz.
Warner
Wahrscheinlich nicht in einem Drehbuch. Versuchen Sie, ein Testskript zu erstellen, das ausgegeben wird shopt expand_aliases. Ich wette, es ist aus. Es befindet sich in meiner RHEL 5.3-Box.
Christopher Karel
Sie treffen den Nagel auf den Kopf. +1
Warner
+1 Danke für diesen Hinweis. Damit komme ich zum größten Teil zu einer Lösung, aber am Ende muss ich immer noch eine andere Datei erstellen. Ich hatte gehofft, es ohne das zu tun.
Keith Bentrup
Keith, ich hatte das gleiche Problem, aber eval 'foo'Crontab hat es geschafft.
Artem Russakovskii
6

bash -c mit "source" sollte funktionieren:

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

Das könnte auch funktionieren. die Periode bedeutet "Quelle"

0 11 * * * . .profile && notify-team
Collin Anderson
quelle
3

Wie Chris festgestellt hat, besteht die Standard-Shell-Option für nicht interaktive Shells darin, keine Aliase zu erweitern. Hier ist eine Lösung, die ich gefunden habe, um zu arbeiten.

Schreiben Sie ein Skript, aktivieren Sie die Shell-Option und geben Sie Ihre Aliase als Quelle an. .bashrcBeachten Sie insbesondere, dass die Quelle bei der Ausführung angegeben wird, weshalb sie nach dem Aktivieren von expand_aliases erneut angegeben werden muss.

Ich entschuldige mich für die anfänglich falsche Empfehlung. Das war dunkler, als ich ursprünglich erwartet hatte.

Skript:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team
Warner
quelle
Danke, aber das habe ich schon versucht. Können Sie bestätigen, dass es auf Ihrem System funktioniert? Ich habe auch versucht, / bin / bash -lc source ~ / .profile; Benachrichtigungs-Team und andere Variationen. Ich bevorzuge es auch, nicht für jeden Alias ​​ein eigenes Skript zu haben. Damit wird der Zweck der Vermeidung von Doppelarbeit zunichte gemacht.
Keith Bentrup
Ich hätte den Fehler von crontab: "Befehl nicht gefunden" bei jeder Variation einfügen sollen, die ich ausprobiert habe.
Keith Bentrup
Mit einer geprüften Empfehlung bearbeitet.
Warner
Danke für das aktualisierte Beispiel. Ich denke, wenn du -l zu deiner ersten Zeile hinzufügst, kannst du deine dritte loswerden.
Keith Bentrup
Ah, gute call-- Login-Shell hätte expand_aliases aktiviert.
Warner
1

Ich mag die Idee von artifex, den Alias ​​aus der Datei zu holen und ihn dann wiederzuverwenden, da ich keine Möglichkeit gefunden habe, Aliase direkt zu erweitern / wiederzuverwenden. (Für andere Lösungen ist noch ein weiteres Skript erforderlich.)

Also habe ich diese Funktion geschrieben und in mein .profile eingefügt:

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

Dann konnte ich es in meiner Crontab für verschiedene Aliase wie dieses verwenden:

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

etc.

Yay, Code-Wiederverwendung! Danke euch allen.

Keith Bentrup
quelle
3
das ist pures böse.
Justin
Wenn ich den Alias ​​direkt verwenden könnte, würde ich. Das ist der Punkt der Frage. Sie können gerne eine andere Lösung vorschlagen, aber ich werde diese Lösung für viele 2-3-zeilige Dateien verwenden, die ein Verzeichnis überladen. Dies geschieht, wenn ich zusätzliche Benachrichtigungsschemata hinzufüge oder beschließe, einige meiner anderen Aliase wiederzuverwenden.
Keith Bentrup
1

Das Einfachste, was Sie tun könnten, wäre, etwas zu erschaffen

~ / bin / benachrichtige mich mit

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

~ / bin / notify-team mit

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

Shell-Aliase sind, wie Sie gesehen haben, kompliziert zu warten und in andere Systeme zu integrieren. Das Beste ist, sie in vollwertige Befehle umzuwandeln, die keine lustigen Umgebungsprobleme verursachen.

Justin
quelle
1
Vielen Dank für den Vorschlag, aber ich hätte nie gedacht, dass Aliase schwer zu pflegen sind. Ich würde lieber eine Datei mit Aliasen pflegen und dann viele Wrapper-Dateien. Das Problem bestand darin, die Aliase in einem Cron-Job auszuführen.
Keith Bentrup
0

bash -ic "notify-team" ist die beste Option. Es stellt Alias ​​in Crontab zur Verfügung. Sie können auch ein & für den Hintergrund hinzufügen, da wir eine 'interaktive' Shell mit -i verwenden, aber in Wirklichkeit nicht damit interagieren.

SuperGeek
quelle
-2
0 11 * * * bash -ic "notify-team" > /log/file

funktioniert bei mir

vakhrymchuk
quelle
1
Eine Erklärung würde die Antwort verbessern
Dave M