• ベストアンサー
  • すぐに回答を!

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で実行しています。 なぜカレントだと上手くいき、フルパスだと上手くいかないのでしょうか? パスが必要なコマンドも入っていないのに。。。 どなたかご教授いただけると幸いです。 宜しくお願い致します。

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数5975
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.4
  • vaidurya
  • ベストアンサー率45% (2710/5975)

まぁ、./の意味は、Windowsでの.\と同じなので MS-DOSで育った人だと、勘違いも起きないんですけどね… .や..が表すのはカレントディレクトリーやその一つ上のディレクトリーです。 WindowsやMS-DOSではDIRコマンドを使えば、.や..も表示されますし DIRの結果では、ファイル数表示にも、+2のファイル数が表示されます。 ゆえにMS-DOS時代にはLinux以上に常識でした。 Linuxでは.で始まるファイル名は標準状態で表示されませんから .と..も、lsコマンドなどで通常表示されません。 ですから「ls -aで表示されるかどうか?」といきなり聞かれても 自信を持って答えられない人も少なくないと思います。 まぁ表示されるんですけどね。今やってみて知りました。 C:が起動ドライブの場合のWindowsでの C:\に相当するのが、UNIX系OSでの/です。 CMD.EXEを起動すると、C:\Document and Settings\USERが カレントディレクトリーになっているような気がしますが (うちにはWindows飼っていないので確認しません) このディクレクトリーに相当するのが UNIX系のOSでのcd[RETURN]で移動するホームディレクトリーです。 /home/user/における./home/user/test.shという指定は C:\Document and Settings\USERにおいて .\Document and Setiings\USER\test.batと指定するのと同じで Windowsでは… C:\Document and Settings\USER\Document and Settings\USER\test.bat という意味になります。 C:\Document and Settings\USER\test.batに相当するのは /home/user/test.shなわけです。 余談ですが、cdで戻る/home/userディレクトリーが UNIXにおける狭義のホームで、文脈によって意味が違ってきます。 .bashrcのような設定ファイルであるドットファイルは 個人設定としてホームディレクトリーに保存しますが この場合は狭義のホームディレクトリーを意味します。 「個人的なデータはホームディレクトリーに保存する」と言えば 厳密に言えば「ホームディレクトリー下に保存」と表現すべきですが 広義のホームディレクトリーとして解釈するのが普通です。 でも、「~/はホームディレクトリーを示す」と言えば 狭義のホームディレクトリーを意味します。 このへんは、あんまり意識して書かれないことがあります。 そのくらい、ホームディレクトリーの扱い方は 常識となっていますから、おかしいと思った時は 用語や書式やオプションの意味を マニュアルやウェブの記事で再確認するといいです。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • シェルスクリプトの1行目に#!を書いてもダメなのはなぜ?

    test.shというシェルスクリプトを #!/bin/bash echo "bash test" のように書き、chmod +x test.shを実行し、 test.shと入力すると、bash testが表示されるはずですが、 エラーbash: test.sh :command not found が出ます。which bashでパスを見ると /bin/bashなので、問題ないはずなんですが。 ちなみに、bash test.shと入力すると、正常に実行されます。 同様のことがperlスクリプト #!/usr/bin/perl print "perl test\n"; についても起こります。 何か設定がまずいのでしょうか? RedHatLinux7.2を使用しています。

  • シェルスクリプトからPHP実行

    シェルスクリプト(bash)内で、以下のようにPHPを呼んだ場合、 その次の処理がPHPの終了を待たずに実行されるようなのですが、 どうしてでしょうか? #!\bin\bash /usr/local/php4/bin/php /home/test.php echo "test!" 以上 なぜか test! という表示がPHPの処理中に出るように思えます。

  • シェルスクリプト 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コマンドで良い解決法ご教示願います。 情報が不足なら指摘いただいた物を追加いたします。

その他の回答 (3)

  • 回答No.3

>./home/user/test.sh 先頭の.はカレントディレクトリを示しています。これだとフルパスではありません。 フルパスとは先頭が/で始まります。 どうして./home/user/test.shとしたいなら cd / でカレントディレクトリを/に移動してから実行してください。

共感・感謝の気持ちを伝えよう!

  • 回答No.2
  • D-Matsu
  • ベストアンサー率45% (1080/2394)

./home/user/test.sh "."はカレントディレクトリを示す記号です。つまりこれは絶対パスではなく相対パスなのです。

共感・感謝の気持ちを伝えよう!

  • 回答No.1
  • tatsu99
  • ベストアンサー率52% (391/751)

フルパス場合、./home/.....の先頭の.はいらないはずです。 それだと、カレントディレクトリ下に/homeがあることになります。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 【Linux】シェルの実行方法を教えて下さい。

    【Linux】シェルの実行方法を教えて下さい。 ファイルの中身が#!/bin/bashで始まる拡張子shのシェルがあります。 これを実行するには、どのようなコマンドを打てばよいのでしょうか? 1.rootでログイン。 2.test.shがあるフォルダに、cdで移動する。 3.test.shと入力し、Enterキーを押す。 ↑みたいな感じで良いのでしょうか。 テスト用サーバなので、最悪壊しても良いと上司に言われましたが、 なにぶん時間がないため質問させていただきました。 Redhatでバージョンが3か4だったと思います。 よろしくお願いします。

  • 他ユーザーのシェルスクリプト実行

    他ユーザーのシェルスクリプトを実行する際に「rsh」や「ssh」を使用しないで実行 する方法が知りたいです。 また、シェルはCのプログラムから実行させたいのでパスワードの入力を求められたり するのは避けたいです。 フルパスを直接指定すれば実行は出来ましたが、ユーザーが変わっていないので ほしい結果が得られませんでした。 OSはredhat linuxです。

  • シェルスクリプト ファイルパス違いによって実行結果が違う 比較

    シェルスクリプト(bシェル)を作成しています。fileA.txtの中身を一行ずつ読み込んで、fileB.txtと比較を行うプログラム(sample.sh)です。 設定しているファイルのパスの違いによって実行が出来るものと出来ないものがあり、その原因がわかりません。 【1】自分のホームディレクトリ(MyDIR)にすべてのファイルを置いている FILEA=/home/MyDIR/TEST/fileA.txt FILEB=/home/MyDIR/TEST/fileB.txt while read line do grep -v "$line" "$FILEB" done < $FILEA  このプログラムは正常に実行できます 【2】FILEA,Bを/tmpの下に作ったTESTディレクトリの下に置いている sample.shは/home/MyDIR/TESTの下、fileA,Bは/tmp/TESTの下。 set FILEA=/tmp/TEST/fileA.txt set FILEB=/tmp/TEST/fileB.txt while read line do grep -v "$line" "$FILEB" done < $FILEA  ファイルのパスをこのように変更すると、while:構文が間違っています。というエラーが出て実行できません。whileの中に入れていないようです。スペルミスはありませんし、パスが違うだけでなぜ実行が出来なくなるのでしょうか? よろしくお願いします。

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

    こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。

  • Linuxのコマンドでcronから実行パスを確実に取り出すにはどうした

    Linuxのコマンドでcronから実行パスを確実に取り出すにはどうしたらいいでしょうか? 具体的には下記から"/home/test/test.sh"の部分を確実に取り出したいです。 */5 * * * * /home/test/test.sh > /dev/null sedとcutを使って取り出す方法はありますでしょうか? パスは場合によって変わる場合があり、test.shのみいつも同じです。 test.shより前の空白までを取り出せればよいのですが、 何かいい方法はありますでしょうか?

  • Linux間のリモートシェルの実行について

    マシンタイプ:x225 カーネル: 2.4.20-28.7smp OS:Red Hat Linux 7.3 2.96-126)) 上記のLinuxサーバからrshで同じタイプのリモートのLinuxサーバのシェルを起動しようとしましたが正常に起動されません。 状況としては rsh実行時は特にエラーメッセージが出ることもなく、正常に実行されたかのように終了してしまうため、何が悪いのかもわからない状態です。 実行したコマンドとリモート側のシェルの内容は以下の通りです。 rsh server1 /home/test/testrsh.sh <testrsh.sh> #!/bin/ksh time=`date` echo "rsh test $time" >> /home/test/testrsh.log ちなみに rsh server1 date や rsh server1 uname 等のLinuxのコマンドは正常に実行できます。 どこを確認したらよいでしょうか? よろしくお願いします。

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

    環境 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を使用しています。

  • シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。

    シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。 ファイル名を変更するシェルスクリプトをbashで行おうとプログラムを作成したのですが、 実行するとbad interpreter: ディレクトリではありません とメッセージが出て終了します。記述に誤りがあるのか、実行の仕方が悪いのか分かりません。教えて下さい。 シェルの記述内容は ファイル名をtest.sh #!/bin/bash/ -f mv A.txt A.ori exit 実行方法として #>chmod x+a test.sh #>./test.sh で行いました。そうしたら、bad interpreter: ディレクトリーではありません とメッセージが出ます。 ちなみに #>. test.sh で実行するとターミナルがシェルの実行と同時に閉じてしまいますが、シェルを実行したディレクトリーを確認すると、処理が終わっておりました。

  • シェルスクリプトを実行後すぐに中断する方法

    シェルスクリプトがどのシェル(bash, zsh, tcsh)で実行されたかを確認したいため実行直後に停止したいのですが、どうすればよいでしょうか? すかさずctrl+zを押しても間に合いません。 (一般的な方法を知りたいのでスクリプト内でwaitというのは無しでお願いします。)