今だけ人気マンガ100円レンタル特集♪

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で実行しています。

なぜカレントだと上手くいき、フルパスだと上手くいかないのでしょうか?
パスが必要なコマンドも入っていないのに。。。

どなたかご教授いただけると幸いです。

宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

まぁ、./の意味は、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のような設定ファイルであるドットファイルは
個人設定としてホームディレクトリーに保存しますが
この場合は狭義のホームディレクトリーを意味します。

「個人的なデータはホームディレクトリーに保存する」と言えば
厳密に言えば「ホームディレクトリー下に保存」と表現すべきですが
広義のホームディレクトリーとして解釈するのが普通です。

でも、「~/はホームディレクトリーを示す」と言えば
狭義のホームディレクトリーを意味します。


このへんは、あんまり意識して書かれないことがあります。
そのくらい、ホームディレクトリーの扱い方は
常識となっていますから、おかしいと思った時は
用語や書式やオプションの意味を
マニュアルやウェブの記事で再確認するといいです。
    • good
    • 0

>./home/user/test.sh


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

./home/user/test.sh



"."はカレントディレクトリを示す記号です。つまりこれは絶対パスではなく相対パスなのです。
    • good
    • 0

フルパス場合、./home/.....の先頭の.はいらないはずです。


それだと、カレントディレクトリ下に/homeがあることになります。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qシェルスクリプトの実行、「source」と「.」の違いについて

bashのシェルスクリプトを書いています。
当方、Mac Snow Leopard を使っているため、seq コマンドがデフォルトでは使えません。
そこで、.bashrc 内に、seq 関数をあらかじめ自分で定義して、他で使い回したいと思っています。
.bashrc の中に、
function seq() {
i=$1
while [ $i -le $2 ] ; do
echo $i
let i=$i+1
done
}
と、関数を定義しました。
seq 関数をターミナル上で実行すると、
>seq 0 2
0
1
2
と正しく、表示されます。次に、

#!/bin/sh
seq 0 2

と記述したシェルスクリプト(temp.sh)を「source」で実行すると、
>source temp.sh
0
1
2
と正しく、表示されますが、「.」で実行すると、
>./temp.sh
./temp.sh: line 2: seq: command not found
と言われます。
どのような理由によってこの違いが出るのでしょうか??

bashのシェルスクリプトを書いています。
当方、Mac Snow Leopard を使っているため、seq コマンドがデフォルトでは使えません。
そこで、.bashrc 内に、seq 関数をあらかじめ自分で定義して、他で使い回したいと思っています。
.bashrc の中に、
function seq() {
i=$1
while [ $i -le $2 ] ; do
echo $i
let i=$i+1
done
}
と、関数を定義しました。
seq 関数をターミナル上で実行すると、
>seq 0 2
0
1
2
と正しく、表示されます。次に、

#!/bin/sh
seq 0 2

...続きを読む

Aベストアンサー

追記

source は現在のシェルで実行し、結果がそのまま現在のシェルに適応されます。
今回の temp.sh なら
> source temp.sh

> seq 0 2
と入力したのと同等ということになります。

> ./temp.sh
この . はコマンドではなく、 temp.shへのパスを指定するものです。
実行ファイル名だけでコマンドとして実行できるのは、環境変数PATHで指定したディレクトリにあるものだけです。それ以外は、その実行ファイルへの絶対パス、または相対パスが必要となります。
これは、カレントディレクトリにある実行ファイルも例外ではありません。
環境変数PATHに . が無い場合は、 ./ファイル名 と相対パスを指定する必要があります。
(この点は、常に . がPATHにあるように振る舞うMS-DOSやコマンドプロンプトとは違います)
逆に、PATH上にあれば(例えば、 PATH=$HOME/bin:(以下略)となっている時の $HOME/bin )、 temp.sh とファイル名だけで実行できます。

また、こうしたコマンドは新規プロセスで実行されますので、環境変数を除いて、現在の設定は継承されません。
対話的ではないbashや、 shとして起動された bash は .bashrcを読まないので、そこに書いてあることは無効となります。

追記

source は現在のシェルで実行し、結果がそのまま現在のシェルに適応されます。
今回の temp.sh なら
> source temp.sh

> seq 0 2
と入力したのと同等ということになります。

> ./temp.sh
この . はコマンドではなく、 temp.shへのパスを指定するものです。
実行ファイル名だけでコマンドとして実行できるのは、環境変数PATHで指定したディレクトリにあるものだけです。それ以外は、その実行ファイルへの絶対パス、または相対パスが必要となります。
これは、カレントディレクトリにある実行...続きを読む

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qシェルスクリプト実行で”そのようなファイルやディレクトリはありません”と出ます。

以下の単純なシェルスクリプトを実行しようとしています。
-------------------
#!/bin/sh
echo ok
-------------------
そのとき、
bad interpreter: そのようなファイルやディレクトリはありません
と出てしまいます。

・which sh で確認すると /bin/sh です。
・Windowsで作ったファイルをFTPのアスキーモードで転送しています。

(ものすごく単純なミスをしてるのかもしれませんが、)
よろしくお願いします。

Aベストアンサー

1行目の「/bin/sh」のうしろにCRが入っていると、このような現象が発生します。
FTPの転送モードが間違いなくアスキーモードになっているか、
転送後のファイルにCRがついていないかなど、再度確認してみてください。

CR以外のコントロールコードや全角スペースなどがついていても似た現象が起こります。
その場合はエラーメッセージが多少異なるはずですが、併せて確認しておくと良いかと思います。

Qshellスクリプトから別のshellスクリプトを呼び出す方法

今現在VineLinux4.1をサーバとして起動させております。
その関係もありまして維持としてシェルを動かす事はある意味必須の状態です。
本題はAと言うスクリプトからBと言うスクリプトを呼び出す方法がわかりません。
試してみた方法はsourceで呼び出す方法です。
A.shの中身を以下とすると

#!bin/bash
echo ="B.shを呼び出します"
source B.sh
echo ="シェルスクリプトを終了します"
exit 0

上記のようにした場合、最初のecho文は出力され、B.shの内容を一通り終えると最後のechoは出力されずA.shは完了しません。
ごくごく基本的なことかもしれませんが、うまく検索にも引っ掛けられなかったので、ご質問させていただきます。
よろしくお願い致します。

Aベストアンサー

#2です。

>cshは=の前後にスペースが入るかと思いますが、今回はbashを指定しておりますので。

cshの何のことを言ってるのかわかりませんが、例えばbashで、
echo="シェルスクリプトを終了します"
は、echoコマンドじゃなくて、echo というシェル変数に「シェルスクリプトを終了します」という文字列をセットするコマンドになります。当然何も表示されません。

>A.shとB.shは単独で正常に稼動できる状態です。

B.shが単独で正常に動いているように思えることは、B.shに問題がないことを意味しません。
例えば、B.sh をexitで終了したりするとそこでbashは終了するわけだし。

>質問の例はあくまで例ですが、

書かれているA.shに問題がなさそうなので、B.shの中に原因があると想像しました。
現象が発生する最小限の、A.sh と B.sh の内容をすべて正確に書いてください。

今気づきましたが、A.sh の最後に無意味なexit 0がありますが、もしかして、B.shの最後にもexit 0が?

source コマンドは、その場所に指定したファイルの内容を挿入するコマンドです( C の #include 相当 )。もし、新たにbashプロセスを起動して、そこでB.shを動かしたいなら、
bash B.sh
です。他には#1の方が書いた方法もあります。

#2です。

>cshは=の前後にスペースが入るかと思いますが、今回はbashを指定しておりますので。

cshの何のことを言ってるのかわかりませんが、例えばbashで、
echo="シェルスクリプトを終了します"
は、echoコマンドじゃなくて、echo というシェル変数に「シェルスクリプトを終了します」という文字列をセットするコマンドになります。当然何も表示されません。

>A.shとB.shは単独で正常に稼動できる状態です。

B.shが単独で正常に動いているように思えることは、B.shに問題がないことを意味しませ...続きを読む

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Qシェルの「:コマンドが見つかりません」エラー

TeraTermでシェル言語を実行したとき、
「:コマンドが見つかりません」というエラーが出ました。
何行目かとか、どのコマンドがとか、具体的にわかることはできないのでしょうか?

Aベストアンサー

sh -x スクリプトファイル名
で、スクリプト中の各コマンドが実行直前に表示されますので、それで大体わかると思います。
ただ、「:コマンドが見つかりません」という表示のすぐ左にそのコマンドが出ているはずです。もしかして、全角空白が入ってそれがエラーになってるとか?

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Qsedなどで、特定の文字列の後の文字列を抽出したい

sedなどで、特定の文字列の後の文字列を抽出したい

シェルスクリプト内で、sedなどを使って特定の文字列の後の文字列を抽出したいのですが、どうすればいいでしょうか?

たとえば、abcXYZ123defghiのなかから、XYZの後の「123」を抜き出したいです。

echo abcXYZ123defghi | sed ...

のようにして実行させたいです。

Aベストアンサー

日本語対応sedだと日本語数字混じりでもできますね。

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/' -e 'y/0123456789/0123456789/'
12357

※ 使っている日本語コードの指定は必要かも(例えば、 --ctype=EUC)

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/'
12357

※ 入力フォームに書いている時はASCIIと日本語の判別がし易いけど回答見るとわかり難いですね。後ろの例での結果57とy/0123456789/の数字部分が日本語です。

Qなぜ、No such file or directory ?

LinuxにHORBをインストールし、パスも通しました。
HORBサーバーを起動するために
$ horb
と、すると
bash: /usr/local/horb2.1/bin/horb : No such file or directory
となって、実行できません。

horbファイルの中身は、
#!/bin/sh
java horb.orb.HORBServer $*
となっています。

直接、
$ java horb.orb.HORBServer
とすれば、HORBサーバーが起動します。

horbファイルの権限が理由でもないと思います。
$ ls -l horb
-rwxr-xr-x   1 myname   users
となっています。

なぜ、
$ horb
ができないのでしょうか。どうか、お教えください。

Aベストアンサー

そのエラーの出方は#!行がちゃんと解釈されないパターンに
見えますね。

改行コードをまず確認してみてください。samba経由かなにかで、
Windows上のエディタで編集してたりしてませんか?
$ vi horb
とviエディタなどで開いてみるとどうでしょう?あるいは
$ od -c horb | head
#!/bin/shのうしろに^Mとか\r\nが来ていませんか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング