Bagaimana cara menggunakan alias saya di crontab saya?

16

Saya memiliki beberapa perintah di saya .profileyang ingin saya panggil dari saya crontab.

Misalnya, jika saya punya,

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

Saya hanya ingin memanggil alias

0 11 * * * notify-team

jadi jika daftar di saya .profilediperbarui, saya tidak perlu memperbarui crontabjuga. Namun, saya sepertinya tidak bisa menggunakan alias di blog saya crontab. Apakah ada pekerjaan?

Saya mencoba saran di sini untuk mengatur lingkungan (mis. / Bin / bash -lc dan script-wrapper script). Sepertinya itu berfungsi untuk skrip tetapi tidak untuk alias.

Ada ide?

Keith Bentrup
sumber
Terima kasih, semua untuk info yang bermanfaat. Beberapa kemungkinan solusi di sini termasuk milik saya. Saya akhirnya mengubah ide asli artifex menjadi sesuatu yang lebih berguna untuk situasi saya. Chris memberikan info yang diperlukan untuk melakukannya dengan skrip terpisah.
Keith Bentrup

Jawaban:

10

Dari manual tentang alias:

Catatan alias tidak diperluas secara default di shell non-interaktif,
dan itu dapat diaktifkan dengan mengatur 'expand_aliases'
opsi shell menggunakan shopt.

Jadi coba gunakan shopt -s expand_aliasesdi awal skrip sumber Anda. Ini seharusnya membiarkan Anda menggunakan saran Warner.

Christopher Karel
sumber
Ini aktif untuk saya di CentOS5 secara default. Catatan keren.
Warner
Mungkin tidak dalam naskah. Coba buat skrip pengujian yang menghasilkan shopt expand_aliases. Saya bertaruh tidak aktif. Itu ada di kotak RHEL 5.3 saya.
Christopher Karel
Anda memukul paku di kepala. +1
Warner
+1 Terima kasih untuk menunjukkan ini. Itu membuat saya sebagian besar jalan menuju solusi, tapi saya akhirnya harus membuat file lain. Saya berharap untuk melakukannya tanpa itu.
Keith Bentrup
Keith, saya memiliki masalah yang sama tetapi melakukan eval 'foo'di crontab berhasil.
Artem Russakovskii
6

bash -c dengan "source" seharusnya berfungsi:

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

ini juga bisa bekerja. periode berarti "sumber"

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

Seperti yang diidentifikasi Chris, opsi shell default untuk shell non-interaktif adalah tidak memperluas alias. Inilah solusi yang saya temukan berhasil.

Tulis skrip, aktifkan opsi shell, dan sumber alias Anda. Berhati-hatilah karena .bashrcbersumber dari eksekusi, itulah sebabnya harus bersumber lagi setelah mengaktifkan expand_aliases.

Permintaan maaf saya untuk rekomendasi yang awalnya salah. Ini lebih tidak jelas dari yang saya perkirakan.

Naskah:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team
Warner
sumber
Terima kasih, tapi saya sudah mencobanya. Bisakah Anda mengonfirmasi bahwa itu berfungsi pada sistem Anda? Saya juga sudah mencoba / bin / bash -lc source ~ / .profile; beri tahu tim dan variasi lainnya. Saya juga lebih suka tidak memiliki skrip terpisah untuk setiap alias. Itu mengalahkan tujuan menghindari duplikasi.
Keith Bentrup
Saya seharusnya memasukkan kesalahan dari crontab: "command not found" pada setiap variasi yang saya coba.
Keith Bentrup
Diedit dengan rekomendasi yang teruji.
Warner
Terima kasih untuk contoh yang diperbarui. Saya pikir jika Anda menambahkan -l ke baris 1 Anda, Anda dapat menyingkirkan 3 Anda.
Keith Bentrup
Ah, panggilan yang bagus - shell login akan memungkinkan expand_aliases diaktifkan.
Warner
1

Saya suka ide artifex untuk mengambil alias dari file dan kemudian menggunakannya kembali, karena saya tidak bisa menemukan cara untuk memperluas / menggunakan kembali alias secara langsung. (Solusi lain masih membutuhkan skrip lain.)

Jadi saya menulis fungsi ini dan meletakkannya di .profile saya:

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

Kemudian saya bisa menggunakannya di crontab saya untuk berbagai alias seperti ini:

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

dll.

Yay, penggunaan kembali kode! Terima kasih semuanya.

Keith Bentrup
sumber
3
itu adalah kejahatan murni.
Justin
Jika saya bisa menggunakan alias secara langsung, saya akan melakukannya. Itulah inti pertanyaannya. Anda boleh mengajukan solusi lain, tetapi saya akan mengambil solusi ini di atas banyak 2-3 file baris yang mengacaukan sebuah direktori - yang akan terjadi ketika saya menambahkan skema pemberitahuan tambahan atau memutuskan untuk menggunakan kembali beberapa alias saya yang lain.
Keith Bentrup
1

Sungguh hal paling sederhana yang bisa Anda lakukan adalah menciptakan

~ / bin / beri tahu-saya dengan

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

~ / bin / beri tahu-tim dengan

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

alias shell rumit untuk dipertahankan dan diintegrasikan ke sistem lain, seperti yang Anda lihat. hal terbaik untuk dilakukan adalah mengubahnya menjadi perintah lengkap yang tidak akan memiliki masalah lingkungan yang lucu.

Justin
sumber
1
Terima kasih atas sarannya, tetapi saya tidak pernah berpikir alias sulit untuk dipelihara, dan saya lebih suka memelihara 1 file alias kemudian menyimpan banyak file pembungkus. Masalahnya adalah mengeksekusi alias dalam pekerjaan cron.
Keith Bentrup
0

bash -ic "notify-team" adalah opsi terbaik. Itu membuat alias tersedia di crontab. Anda selanjutnya dapat menambahkan & untuk latar belakang karena kami menggunakan shell 'interaktif' dengan -i, tetapi pada kenyataannya tidak berinteraksi dengannya.

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

bekerja untukku

vakhrymchuk
sumber
1
Beberapa penjelasan akan meningkatkan jawabannya
Dave M