crontabでエイリアスを使用する方法は?


16

私は私の中にいくつかのコマンド持って.profile、私は私から呼び出したいですcrontab

たとえば、私が持っている場合、

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

エイリアスを呼び出すだけです

0 11 * * * notify-team

のリスト.profileが更新された場合、私も更新する必要はありませんcrontab。ただし、でエイリアスを使用できないようですcrontab。回避策はありますか?

環境をセットアップするために、ここで提案を試みました(例:/ bin / bash -lcおよびscript-wrapperスクリプト)。これはスクリプトでは機能するようですが、エイリアスでは機能しないようです。

何か案は?


有益な情報をありがとう。私自身のものも含めて、ここでいくつかの可能な解決策。最終的には、artifexの元のアイデアを、自分の状況により役立つものに変更しました。クリスは、別のスクリプトでそれを行うために必要な情報を提供しました。
キースベントラップ

回答:


10

エイリアスに関するマンページから:

非エイリアスシェルではエイリアスはデフォルトで展開されないことに注意してください。
「expand_aliases」を設定することで有効にできます
shoptを使用したシェルオプション。

そのためshopt -s expand_aliases、ソーススクリプトの開始時に使用してみてください。これにより、ワーナーの提案を使用できます。


これはデフォルトでCentOS5でオンになっています。しかし、クールな注意。
ワーナー

ただし、おそらくスクリプトには含まれていません。を出力するテストスクリプトを作成してみてくださいshopt expand_aliases。私はそれがオフであることを賭けています。それは私のRHEL 5.3ボックスにあります。
クリストファーカレル

頭に釘を打ちます。+1
ワーナー

これを示すための+1 Thx。ほとんどの方法で解決できますが、それでも別のファイルを作成する必要があります。私はそれなしでそれをやりたいと思っていました。
キースベントラップ

キース、私は同じ問題を抱えていましたがeval 'foo'、crontabでやることでうまくいきました。
アルテムルサコフスキー

6

「source」を指定したbash -cは動作するはずです。

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

これも機能する可能性があります。期間は「ソース」を意味します

0 11 * * * . .profile && notify-team

3

Chrisが特定したように、非対話型シェルのデフォルトのシェルオプションは、エイリアスを展開しないことです。ここに私が見つけた解決策があります。

スクリプトを記述し、シェルオプションを有効にして、エイリアスを取得します。.bashrcこれは実行時にソースされるため、特にexpand_aliasesを有効にした後に再度ソースする必要があることに注意してください。

最初の誤った推奨事項に対する謝罪。これは、当初予想していたよりもあいまいでした。

脚本:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team

Thx、しかし、私はすでにそれを試しました。システムで動作することを確認できますか?/ bin / bash -lc source〜/ .profileも試しました。通知チームおよびその他のバリエーション。また、エイリアスごとに個別のスクリプトを持たないことを好みます。それは重複を避ける目的を無効にします。
キースベントラップ

試したすべてのバリエーションにcrontabからのエラー「コマンドが見つかりません」を含めるべきでした。
キースベントラップ

テスト済みの推奨事項で編集。
ワーナー

更新された例のThx。1行目に-lを追加すると、3行目を削除できると思います。
キースベントラップ

ああ、いいコールです。ログインシェルではexpand_aliasesが有効になります。
ワーナー

1

エイリアスを直接展開/再利用する方法が見つからなかったので、ファイルからエイリアスを取得して再利用するというartifexのアイデアが好きです。(他のソリューションでは、まだ別のスクリプトが必要です。)

だから私はこの関数を書き、それを私の.profileに入れました:

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

次に、このようなさまざまなエイリアスのcrontabで使用できました。

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

ええ、コードの再利用!皆さんありがとう。


3
それは純粋な悪です。
ジャスティン

エイリアスを直接使用できる場合は、使用します。それが問題のポイントです。別の解決策を提案することを歓迎しますが、この解決策をディレクトリを乱雑にする2〜3行のファイルに引き継ぎます。これは、通知スキームを追加するか、他のエイリアスの一部を再利用することになります。
キースベントラップ

1

本当にできる最も簡単なことは、作成することです

〜/ bin / notify-me with

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

〜/ bin / notify-team with

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

これまで見てきたように、シェルエイリアスは、維持および他のシステムへの統合が複雑です。最善の方法は、環境の問題が発生しない本格的なコマンドに変換することです。


1
提案をありがとう、しかし、私はエイリアスが維持するのが難しいと決して思いませんでした、そして、私はむしろ1つのエイリアスのファイルを維持して、それから多くのラッパーファイルを維持したいです。問題は、cronジョブでエイリアスを実行していました。
キースベントラップ

0

bash -ic "notify-team"が最適なオプションです。crontabでエイリアスを利用できるようにします。-iで「対話型」シェルを使用しているため、バックグラウンドに&をさらに追加できますが、実際には対話しません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.