• ベストアンサー

シェルスクリプトからコマンド存在検査をするには?

シェルスクリプト内で「コマンド(コマンドラインツール)の存在検査」をする方法を伺っても宜しいでしょうか? testコマンドで実験してみましたが、残念乍ダメでした。 環境:Cygwin(bash)、WinXP Pro 全パッチあて 以上どうぞ宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

「PATHの通ったところにmakeコマンドがあるか」つまり「フルパスを指定しなくともmakeコマンドが実行できるか」ということを確認したのですよね多分。 test コマンドは、コマンドの有無でなくファイルの有無しか確認できません。 真っ当にやるなら、PATHを : で分解して、各ディレクトリにmakeがあるか順番に見ていきます。 IFS=: ARI=false for d in $PATH do test -x $d/make && ARI=true done if $ARI then echo コマンドあり else echo コマンド無し fi bashであればtypeコマンドを使うのが楽でしょう。 if type -P make >/dev/null then echo コマンドあり else echo コマンド無し fi

simple0123
質問者

お礼

全く仰る通りです。 ご提示頂いた前者のコードでうまくいきました。どうも有難うございました。

その他の回答 (4)

noname#98978
noname#98978
回答No.5

Path 以外にあるコマンドは、whichでは見つかりません。

  • ishi7474
  • ベストアンサー率32% (71/216)
回答No.4

whichのmanページがなぜか私のCygwinに入っていないので確実なことは 言えませんが、whichコマンドの戻り値が0ならコマンドは存在します。

noname#39970
noname#39970
回答No.2

コマンドというより 普通にファイルが有るか検査するのと同じifで良いんじゃない?

simple0123
質問者

補足

if[ -e make ] のような感じでやってみましたが、ifの評価式は常にfalseでした。 makeはインストール済です。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「コマンド (ラインツール) の存在検査」とは, 何をしたいのでしょうか? test をどのように使って, どのような結果を期待したところどのような結果が得られたのでしょうか?

simple0123
質問者

補足

>何をしたいのでしょうか? コマンドのインストール検査です。 ある仕事をするシェルスクリプトがあるとします。 先頭部で、その仕事に必要なコマンド(ツール)全てが揃っているかを検査、揃っていなければメッセージを出して終了、という工程をやる為の物です。 makeのインストール検査を行う為、test -f make を実行しましたが、結果はtestの結果はfalse(0)でした。

関連するQ&A

  • [シェルスクリプト内で bashコマンド後のコマンドが実行されない]

    [シェルスクリプト内で bashコマンド後のコマンドが実行されない] 以下の様にシェルスクリプトを記述するとコマンド2が実行されません。 #! /bin/sh コマンド1 bash コマンド2 bash環境でコマンド2を実行させるにはどうしたら良いのでしょうか?

  • msys(cygwin)で、シェルスクリプトのcdが動かないのは何故?

    msys(又はcygwin)で、シェルスクリプトに書いたcdが働きません。その解決方法を伺っても宜しいでしょうか?具体的には、下のような状況です。 [シェルスクリプト内容] #!/bin/bash echo cd前 cd testdir # ↑testdirは既存。コマンドラインから手打ちすると機能する! echo cd後 [実行結果の表示] cd前 : No such file or directory cd後 [環境] ・WinXP + 最新全パッチ適用 ・msysとcygwinをインストール 以上 どうか宜しくお願い致します。

  • シェルスクリプト bashのtestコマンドが動きません

    こんにちは、ど素人なのにシェルスクリプト仕事で書かされ苦しんでます。 SUN-solaris8で動作したシェルをLinuxE3.0へ移動させたら testコマンドでエラーになりました。 SUN-solaris8ではbsh LinuxE3.0ではbashです。 test -s file名は両方で認識するようですが、 test -s ../directory名/file名で指定して 実行するとSUNでは動作したのですが Linuxではわけの分からないメッセージが出て終了。 Linuxで % sh と打つと/bin/bash % test と打つと /XXX/usr/binだったかな?パス忘れました。 % man bashでマニュアル見るとtestは[]で囲め?   英語だから良く分からなかった。   疲れたので今日は諦めました。 testコマンドで良い解決法ご教示願います。 情報が不足なら指摘いただいた物を追加いたします。

  • Cygwinのシェルスクリプトから、DOSのバッチファイルを起動できる?

    Cygwin(bash)で使うシェルスクリプトの中から、MS-DOSのバッチファイル(.bat)を起動できるでしょうか? 実験では不可能( Cygwin(bash)からcommand not found と言われてしまう)でした。が、もしかしたら裏技的にできる方法をご存知の方がいらっしゃるかと思い、質問させて頂きました。 以上どうぞ宜しくお願い致します。

  • シェルスクリプトのbashとperlについて

    シェルスクリプトのbashとperlについて 今さら気づいたのですが、PerlもUNIXのコマンドやシェルスクリプトとして使用できるということでしょうか。 RubyやPHPをUNIXのコマンドやシェルスクリプトとして使用することはできますでしょうか。 学ぶとしたら、bashとPerlのどちらが良いでしょうか。 また、シェルスクリプトはどんな用途や利点がありますでしょうか。 Webアプリケーションによるバックアップやログをタイマーでセットして自動的に取得したりすることは可能でしょうか。

  • シェルスクリプト内のcdで、カレントディレクトリを変えるには?

    シェルスクリプト内のcdコマンドで、カレントディレクトリを変えるにはどうしたらいいか?をどうか教えて下さい。 MS-DOSのバッチファイル内で"cd XXXXX"と書き実行した時の動作を、UNIX(CygWin)環境でも行いたいです。 が、シェルスクリプトは(サブシェルで動く為)カレントディレクトリが変わってくれません。aliasコマンド等でいろいろ実験しましたが、DOSバッチファイルのように「バッチファイル単体でディレクトリ移動が出来る方法」を探し出せませんでした。 極めて初歩的とは存じますが、どうか宜しくお願い致します。

  • シェルスクリプト内に半角カナはOK?

    UNIX系のシェルスクリプトで「半角カナをコメントで使うのはOKでしょうか?」 今、WinXP+CygwinのbashではOKのようです(全ての半角カナを試したり、十分な組み合わせを試しきれていませんが...)。 が、「他の環境(全linux、BSD、SystemV...)では、ダメなのかな?」と思い、質問させて頂いた次第です。ネット1時間調べたら「ダメ」とは明示されていませんでした。 どうか宜しくお願い致します。

  • シェルスクリプトについて

    とあるUNIXサーバが1台あるとします。 でそのマシン上の管理プログラムが同一マシン上にある 「シェルスクリプト(bash)」をキックするとします。 となるとそのシェルスクリプトの実行者(?)は Unixにログオンしているユーザーになるのでしょうか?。 目的としてはそのログインしているユーザーの環境変数 をシェルから参照したいのですが・・ 考え方がWindowsなもので。。すみませんが よろしくお願いします。

  • シェルスクリプト間で排他をとりたい

    環境 linux(redhat) 使用シェル bash シェルスクリプトAとシェルスクリプトBを作成し、 シェルスクリプトAが動作している間は、シェルスクリプトBの動作を禁止したいと考えています。 例えば、シェルスクリプトAが起動している状態で、シェルスクリプトBが起動されたとき、シェルスクリプトBは、シェルスクリプトAが起動していることを検知して、自発的に処理を終了するようにしたいと考えています。 上記のような仕組みをシェルスクリプトで実現可能でしょうか? 基本的には、シェルスクリプトの先頭で、ある資源のロックを行い、終了時にロックの解放ができれば、その仕組みは実現可能と考えています。 (シェルの異常終了時は、ロックが自動的に解放されることが望ましい) 上記のようなことをシェル(bash)で実現可能でしょうか。 bash単独での方法、もしくはbashからperl,C言語作成の実行モジュールを呼び出す方法でもかまいません。 (ちなみにperl(もしくはC言語作成のモジュール)単独では実現可能なことはわかっています)

  • シェルスクリプトの引数について

    test.sh '*.c' といったコマンドを入力した時に、 シェルスクリプト内で引数$1を受け取ったときに$1='*.c'となるのではなく、 カレントディレクトリ内にある'*.c'の正規表現にマッチするファイルが入ってしまっています。 例)カレントディレクト内にaaa.cファイルbbb.cファイルといったファイルがある時は、 $1=aaa.c bbb.cとなっています。 '*.c'の正規表現自体をシェルスクリプト内で受け取る方法はないのでしょうか? シェルはbashを使用しています。