• ベストアンサー

コマンドをフルパスで入力する理由

ちょっと質問なのですが、コマンドをフルパスで入力するのとそうでないのとでは違いは大きいでしょうか。たとえば、 /bin/grepとか。 スクリプトの中にたくさんコマンドを詰め込んでサーバーに負荷を 与えてチェックした所、省略したコマンドだと通常は実行できるはずが、 負荷のせいなのか、コマンドが見つからないというエラーになりました。 対してフルパスで指定してから負荷テストを行うとコマンドを 実行してくれました。 できればコマンドが多い分、スクリプトの中をすっきりさせる為に コマンドを略して記述したいのですが、フルパスで指定したほうが よいものでしょうか。。

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

  • ベストアンサー
  • 774danger
  • ベストアンサー率53% (1010/1877)
回答No.3

高負荷でPATHが参照できなかったのか、理由はよくわかりませんが、 ・高負荷で通常の状態とは異なる状態 ・フルパスで指定すればきちんと実行できる という状況でスクリプトを確実に動かしたいのであれば、スクリプト内でフルパス指定するのが確実でしょう No.2のかたが書かれているようにスクリプト内でPATHを設定してきちんと動くかどうかも試してみる価値があると思います なお、カレントディレクトリにPATHを通すことは危険なので、一般には行いません (自分しか使っていない、他の人間が入ってこないようなマシンなら別かもしれませんが) http://penguin.tantin.jp/security/path%E3%81%AE%E8%A8%AD%E5%AE%9A.html http://www.atmarkit.co.jp/flinux/rensai/linuxtips/040execcaprog.html に書かれているようにセキュリティ上問題があるからです

r-linux
質問者

お礼

参考URLの中の「同じプログラムがあって。。。」 がとてもピンときましたっ ありがとうございます。 誰かに渡すだけでなく、自分で忘れてて同じ名前のプログラムを 作成していて、意図したスクリプトが実行されず。。。 なんてこともありえそうですものね。 URLとても助かりましたっ フルパスで行きます!! ありがとうございましたっ

その他の回答 (2)

  • kichiwave
  • ベストアンサー率41% (10/24)
回答No.2

/bin/grep は絶対パス(フルパス)であってますよ 通常コマンドを打つ場合は、環境変数のPATHから ディレクトリを補完されて実行されてます。 個人的には、シェルスクリプトをテストする時は ログインしてるのでPATHが通ってるから動くように見えるけど cronに登録して実行した時PATHが通って無くて実行できない とかPATHを通す順番が違って別バージョンのコマンドが動いてた などといった違いでバグのもとになったりするので シェルスクリプト内で使われるコマンドは できるだけ絶対パスで書いた方がいいかなと思いますけど スクリプトファイルの中でPATHを通してやれば ディレクトリの指定無しで実行することができるはずですよ。

r-linux
質問者

お礼

そうですよね。 誰かに渡したいスクリプトになるので、その誰かが、 自分のスクリプトの中で実行するコマンドと同じ名前の プログラムを作ってて、そちらを実行されてしまって 予想外な展開になることが考えられますね すごくすっきりしてきました。 スクリプトの中は逆にスッキリしなくなりますけど、 自分の気持ちが晴れてきました!! >スクリプトファイルの中でPATHを通してやれば おそらく何度も実行するコマンドがあれば、一度 始めに変数として代入?というのでしょうか。 GREP=`/bin/grep`としておいてから後で $GREPを何度も使うみたいな。 すごくタメになります!! 楽しくなってきました!! あざす!!

回答No.1

カレントディレクトリならば、フルパスで指定する必要は無いと思います。 /bin/grep もフルパスでは有りません。相対パスです。 参考: http://www.linux-beginner.com/linux_kihon15.html 参考: Linuxのディレクトリ構造 http://kansai.homelinux.com/~Linux/linux-directry-stracure.htm

r-linux
質問者

お礼

すばやい回答ありがとうございます カレントディレクトリという意味は今いるディレクトリ (実行スクリプトが設置されてるディレクトリ)という認識でいます。 まちがってたらすいません。 自分が気にしているのは以下の2点なのです。 1.スクリプトの中のコマンド達を正確に実行させたい。 2.スクリプトの中を出来るだけすっきりさせたい 上記に対して フルパス記述でない場合、そのコマンドを探しにいく フルパス記述の時は直接コマンドを実行できる。 という違いがあるのでは?と推測しています。その為、 すっきりさせたいけど、全部のコマンドをフルパスで 記述しないと正確に実行できないかもしれない。。。 というモヤモヤがあるのです。。 何かご教授いただけますでしょうか。

関連するQ&A

  • シェルスクリプト コマンドを変数にした時の呼び方

    はじめまして、シェルスクリプトを勉強中の者です。 コマンドを変数にいれて、まとめました。 しかしコマンドの変数を呼びこもうとするとエラーになります。 ============================================ #!/bin/sh GREP="grep" cat "${GREP} '^[0-9]' /home/hoge/test.nicdf" ============================================ ================ シェル実行結果 ============= $ ./test.sh cat: grep '^[0-9]' /home/hoge/test.nicdf: そのようなファイルやディレクトリはありません どう書けば、エラーにならずに正常に動作するでしょうか? ご教授の程よろしくお願いします。

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

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

  • PHPのCLI(コマンドライン)について

    PHPのCLI版について教えていただきたいことがあります。 まず、前提条件として、 OS:Redhat Linux 9.0 PHP:4.4.1 WEB:Apache2.0 MAIL:qmail となっています。 確認事項としてphpのパスを確かめるために、SSHなどのコマンドラインから、 (A)のようにパスを指定して実行した場合、正常に処理できます。 (A) [/ ]# /usr/local/bin/php <?php phpinfo(); ?> 実行→phpinfoの内容が表示される 次に、qmailの転送機能を利用し、受信したメールを自動的に前述の test.phpに渡すとmaillogに以下のようにログが残っています。 delivery 1488: deferral: /bin/sh:  /var/www/sample/test.php:  /usr/local/bin/php :  bad interpreter:  No such file or directory test.phpのパスは正しく設定されており、 [/ ]# /usr/local/bin/php /var/www/sample/test.php とした場合、正しく読み込みます。 また、test.phpの1行目には #!/usr/local/bin/php と記述してあり、もう一台のサーバー(Redhat Linux 2.1AS)では 正しく動いております。 実行できない原因を調べる手段として、 ・この設定を確認 ・このコマンドを実行 など、まず何をチェックすればいいのか 教えていただけると助かります。 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • linuxコマンドについて

    かなりのLinux初心者です。ですので本文中にも間違いがあるかもしれません。 Linuxのコマンドで、各コマンドというのはbinとかsbinの中にあるんですよね? そしてpathが通っていないと、/usr/local~とすべて記述しなくてはいけませんよね? そこで、質問です。 今、bin内にあるコマンド(who)をあるディレクトリで実行したい時、このpathの通し方を教えてもらいたいのです。 次の質問は、例えばwhoコマンドがどこのフォルダ(binやsbin)内にあるか分からない時、探し方を教えてもらいたいのです。 宜しくお願いします。 なにぶん初心者なので説明に不十分なところがあると思いますが、その時は補足要求してください。

  • ブラウザ上からなら実行可能なスクリプトがコマンドラインだと実行しません

    ブラウザ上からなら実行可能なスクリプトがコマンドラインだと実行しません windowXP, perl5 で開発しています。 簡単なプログラム(test.pl)なのですが ----- #!/usr/bin/perl use IO:Socket メール送信処理 1; ----- ブラウザ上から実行すると正しくメール送信されますが、 これをコマンドプロンプトから ----- perl test.pl ----- とすると、 Can't locate IO/Socket.pm と出てしまいます。 pathが通ってないとか絶対パスとかそのあたりかと思い、 socket.pmのあるパスを通したりしましたが、変化しません。 use IO::Socket を絶対パスとかで指定するのでしょうか? 解決方法をお教え頂ければと思います。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • コマンドのフルパスの確認

    一般ユーザーでコマンドを実行する場合、フルパスで ないと実行できないものがあるので、 ・find / -name コマンド名\* -print ・locate コマンド名 この方法でフルパスを確認しています。ただ、この方法だと コマンド名の中にはヒットしすぎて時間がかかるのがあります。 表示が短くて確実にフルパスを表示させる方法はあるのでしょうか?

  • Linuxコマンドのパス取得方法

    すいません、どなたかお分かりの方おられましたらアドバイスいただけましたら助かります。 PHPからLinuxコマンドのwgetとlhaコマンドを実行しています。 しかし、実行するサーバーによってコマンドパスが違うので whereisでパスを取得してからPHPで実行するようにしています。 しかし、CRONで実行したときにだけ、そのパスが取得できない状態です。 こういった場合、どのようにしたらパスが取得できるでしょうか。。 環境:さくらインターネットビジネスプロ FreeBSD 7.1-RELEASE-p15 whereis wgetを コンソールで実行した場合 ⇒ wget: /usr/local/bin/wget /usr/local/man/man1/wget.1.gz CRONで実行した場合 ⇒ wget: /usr/local/man/man1/wget.1.gz whereis lhaを コンソールで実行した場合 ⇒ lha: /usr/local/bin/lha CRONで実行した場合 ⇒ lha: よろしくお願いしますm(_ _)m

  • Linuxでシェルスクリプトがフルパスだと実行できない

    Linuxでシェルスクリプトがフルパスだと実行できない こんにちは 現在linuxでシェルスクリプトを記載していて、やっと出来た!と思ったら、なぜかフルパスで実行すると失敗します。 中身は例えば #!bin/sh echo "hello" とし、ファイル名をtest.shとします。 実行時にカレントからだと上手くいきます。 ./test.sh ただし、フルパスで実行するとうまくいきません。 ./home/user/test.sh エラーは以下 bash: ./home/dv3/tet.sh:No such file or directory 所有者はrootでグループもrootにしてあります。 シェルの権限は755にして、rootで実行しています。 なぜカレントだと上手くいき、フルパスだと上手くいかないのでしょうか? パスが必要なコマンドも入っていないのに。。。 どなたかご教授いただけると幸いです。 宜しくお願い致します。

  • java 実行コマンドについて

    java の実行コマンドについての質問です。java実行コマンドでは実行したいファイルを相対パスで指定できないのでしょうか? 具体的には、 現在、実行したいプログラムは ~/program/sample/Test.class となっています。 カレントディレクトリは~/programで、次のようなコマンドを行いました。 ~/program$ java sample/Test すると Exception in thread "main" java.lang.NoClassDefFoundError: sample/Test (wrongname: Test) という例外が出ました。 ~/program$ java -classpath sample Test を行えば実行できるのですが、java実行コマンドでは相対パスで実行ファイルを指定することはできないのでしょうか? (javacコマンドでは相対パスでコンパイルできる、つまりコンパイルしたいファイルが~/program/sample/Test.javaならば ~/program$ javac sample/Test.java でコンパイルできるので、これの類似でjavaコマンドでも相対パスで実行できるのではないかと考えたのですが。)

    • ベストアンサー
    • Java
  • requireでの絶対パス

    いつもお世話になっております。 requireを使ってファイルをインクルードしているのですが、その際は相対パスで記述しています。 <?php require("../template/test.php"); ?> これを絶対パスでうまく記述する方法はあるのでしょうか? 通常、絶対パスで書いてしまうと、iniファイルで定めた絶対パスの指定フォルダが対象になってしまうため、サーバー上での絶対パスにしたいのですが…。 方法がありましたらご教授よろしくお願いします。

    • ベストアンサー
    • PHP