Co jest nie tak z moją składnią cronjob, próbuję użyć backsticka (`)?

31

Oto, co chciałbym zautomatyzować:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +%Y-%m-%dZ%I:%M`"

Oto komunikat o błędzie:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Terry G. Lorber
źródło
2
Oprócz błędu dawania, rozważ umieszczenie tego w skrypcie schell. Będzie udawać, że crontab jest niezdarny i możesz dodawać komentarze i konfigurować do pliku skryptu.
PeterMmm

Odpowiedzi:

67

Z crontab (5) :

Szóste pole (reszta wiersza) określa polecenie do uruchomienia. Cała część polecenia wiersza, aż do znaku nowej linii lub%, zostanie wykonana przez / bin / sh lub przez powłokę określoną w zmiennej SHELL pliku crontab. Znaki procentu (%) w poleceniu, chyba że poprzedzone znakiem odwrotnym ukośnikiem (), zostaną zamienione na znaki nowej linii, a wszystkie dane po pierwszym% zostaną przesłane do polecenia jako standardowe wejście. Nie ma sposobu na podzielenie jednego wiersza poleceń na wiele wierszy, np. Końcowe „\” powłoki.

Po prostu dodaj odwrotne ukośniki przed znakami%:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
Juliano
źródło
8

Aby rozwiązać problem, wyjdź z% znaków . date +%Y-%m-%dpowinno byćdate +\%Y-\%m-\%d

Niestety, ta odpowiedź jest nieco spóźniona, ale problem nie dotyczy ŚCIEŻKI ani odwrotności - chodzi po prostu o to, że znak procentu „%” jest znakiem specjalnym używanym do oznaczenia NEWLINE lub STDIN we wpisach crontab .

Jest to sprzeczne z formatowaniem danych wejściowych datepolecenia. Jako takie polecenie, które obejmuje: date +%Y-%m-%dbędzie interpretowane jako:

date Y- m- d

Eric Kigathi
źródło
4

Miałem też wiele problemów z backtickami. Czasami potrzebujesz więcej niż jednego wystąpienia cytatów i backticks. Po prostu zamień je na $ ().

Przykład:

export NOW=`date`
by
export NOW=$(date)

-Gilson Soares

Guilsson
źródło
1
+1 W każdym razie jest to obecnie ulubiona składnia.
Dan Carley,
4
ale nie ma to nic wspólnego z pytaniem użytkownika.
Aaron Brown,
1
oczywiście, że chodzi o backsticks, ponownie przeczytał pytanie.
Sergio Abreu
Dzięki, zajęło mi trochę czasu, zanim zdałem sobie sprawę, że backticks psują moje crony - zacząłem też używać $ () we wszystkich moich skryptach
Eric Kigathi
-2

Nie ma to nic wspólnego z backsticksami. Straszne jest to, że cron NIE WIDZIE ŚCIEŻKI, a MUSISZ powiedzieć cronowi „czym jest ŚCIEŻKA?” w kółko w skryptach crona.

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

I opowiadam się za zapisaniem polecenia w pliku zamiast przekazania polecenia dosłownie w wierszu cron. Jest o wiele bardziej elegancki

* * * * * /your/script/here

niż

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

linia ta może przejść do jednego pliku, pliku chmod + x i tego pliku, który ma zostać wywołany.

Sergio Abreu
źródło