やりたいこと
hulft送信コマンドを含むあるバッチ処理を実行し、正常終了させたい。
hulft送信コマンドはローカル環境でそもそもコマンドがなかったり、外部システムとつながっていない環境なので実行しても異常終了してしまう。
これをなんとかしたい。
応用例として、特定のコマンドの処理結果を変更することもできる。
正常終了させたい処理
hulftコマンドであることは特に重要ではないですが、例としてhulftコマンドの場合で説明します。
sudo -u [hulft用ユーザ] [utlsendへのパス]/utlsend -f [ファイルID] -sync
ただしsudoがなく、かつ下記のようにフルパスで指定されている場合は以下の方法はできません。
[utlsendへのパス]/utlsend -f [ファイルID] -sync
やり方
1.ダミーコマンドを作成する
echo ":" >~/bin/sudo
2.実行権限を付与する
あまりよろしくないかもしれませんが、面倒なので私はいつもコレで。
chmod 777 sudo
3.パスを通す**(重要!!)**
上記で作成したダミーコマンドにパスを通しますが、ダミーコマンドを作成したディレクトリを必ず一番左側にくるようにしてください。
PATH=~/bin:${PATH}
4.バッチを実行する
しくみ
まず、
sudo -u [hulft用ユーザ] [utlsendへのパス]/utlsend -f [ファイルID] -sync
に到達した段階で(他のコマンドでも同じですが)sudo
がどこにあるかな、と検索します。
通常であれば/bin
あたりに存在するかと思います。
この検索の仕組みが環境変数PATH
にあるディレクトリを左側から順番に検索していって、コマンドが最初にあった場所を採用するというものなので、/bin
より左側にダミーコマンドを作成したディレクトリを設定しておけば、ここを採用してくれるという訳です。
実験
初期状態
$ echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin
$ which cat
/bin/cat
~/bin
にcatを作成する
(touch
しただけではダメで実行権限をつけないとダメみたい。そりゃそうか。)
$ touch ~/bin/cat
$ chmod 777 cat
$ PATH=~/bin:$PATH
$ echo $PATH
[ホームディレクトリ]/bin:/sbin:/bin:/usr/sbin:/usr/bin
$ which cat
~/bin/cat
これでcatでファイルの中身を見られなくなりましたね←
$ seq 3 | cat -
$ seq 3 | /bin/cat -
1
2
3
パスを指定すればさすがに元のcat
を認識する。
実験は以上。
次に、ダミーコマンドである
:
ですが、:
は単なる記号ではなく「ヌルコマンド」と呼ばれるものです。
sudo
は実質:
と化しているので、
sudo -u [hulft用ユーザ] [utlsendへのパス]/utlsend -f [ファイルID] -sync
は
: -u [hulft用ユーザ] [utlsendへのパス]/utlsend -f [ファイルID] -sync
となります。
つまり、-u
と[hulft用ユーザ]
と[utlsendへのパス]/utlsend
と-f
と[ファイルID]
と-sync
が:
への引数になっています。
が、:
は引数を貰っても何もせず正常終了するという性質を持っているので、(処理ステータスだけ考えれば)あたかも正常終了したかのように見える訳です。
上記の実験をしている最中に思ったのですが、echo ":" >~/bin/sudo
なんてことをしなくてもtouch ~/bin/sudo
でもいけそう。
以上