web-dev-qa-db-ja.com

crontabでエイリアスを使用するにはどうすればよいですか?

crontabから呼び出したいコマンドが.profileにあります。

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

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でエイリアスを使用できないようです。回避策はありますか?

環境をセットアップするための提案 here を試しました(例:/ bin/bash -lcとスクリプトラッパースクリプト)。スクリプトでは機能するようですが、エイリアスでは機能しません。

何か案は?

17
Keith Bentrup

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

エイリアスは非インタラクティブシェルではデフォルトで展開されないことに注意してください。

ソーシングスクリプトの最初にshopt -s expand_aliasesを使用してみてください。これにより、ワーナーの提案を使用できます。

10

「ソース」を指定したbash -cは機能するはずです。

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

これもうまくいくかもしれません。ピリオドは「ソース」を意味します

0 11 * * * . .profile && notify-team
6
Collin Anderson

Chrisが指摘したように、非対話型シェルのデフォルトのシェルオプションは、エイリアスを展開しません。これが私が機能することがわかった解決策です。

スクリプトを記述し、Shellオプションを有効にして、エイリアスを入手します。特に.bashrcは実行時に供給されるため、expand_aliasesを有効にした後で再度供給しなければなりません。

最初は正しくない推奨事項に対する私の謝罪。これは、当初思っていたよりもあいまいでした。

脚本:

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

あなたができる最も簡単なことは、作成することです

〜/ 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
Justin

エイリアスを直接展開/再利用する方法が見つからなかったため、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'

等.

はい、コードを再利用します。皆さんありがとう。

1
Keith Bentrup

bash -ic "notify-team"が最良のオプションです。 crontabでエイリアスを使用できるようにします。 -iで「インタラクティブ」シェルを使用しているため、背景に&を追加することもできますが、実際には対話しません。

0
SuperGeek