LoginSignup
1
3

More than 3 years have passed since last update.

シェルスクリプトを実行する際に、特定のコマンドだけ実行しない方法(やや強引)

Last updated at Posted at 2017-09-29

やりたいこと

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を認識する。

実験は以上。

次に、ダミーコマンドである

~/bin/sudo
:

ですが、:は単なる記号ではなく「ヌルコマンド」と呼ばれるものです。
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でもいけそう。

以上

参考にさせて頂いたサイト様

環境変数 PATH UNIX_Linuxの部屋

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3