【先着1,000名様!】1,000円分をプレゼント!

シェル、コマンドを実行に関して質問があります。
シェル名だけ「シェル名」だけで実行できたり「./シェル名」としないと実行できなかったりしますが、この違いはどこからくるのでしょうか?
また、「csh シェル名」とするばあいもありますが、これらの明確に違い(使い分け)が分かりません。
ご教授の程宜しくお願いいたします。

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

A 回答 (5件)

パスを省略すると、環境設定のPATHに記述された順にコマンドを探しに行きます。



「csh シェル名」とするのは、cshにファイルを渡しています。
先頭のcshを省略するためには、ファイルの先頭に #!/bin/csh (環境に応じて変更要)の記述がある
ことと、そのファイルに実行権限がついていることが必要になります。

なお、「./シェル名」とすることは、PATHによって意図したコマンドとは別に存在する
コマンドを呼んでしまうことがないようにする良いマナーです。
特にrootではコマンドはフルパスで実行するよう心がけましょう。

コマンドの場所は、 which で探すことができます。
PATHによって複数のコマンドが呼べる場合は、whereis で探すこともできます。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2006/10/31 16:24

セキュリティーの概念からカレントディレクトリ<./)にある


実行権のあるファイル(スクリプトや実行ファイル)はパスを通していない状態だと
./ファイル名でないと実行できなくなっています。
PATHに設定すれば./なしでも実行はできますがお奨めしません。
    • good
    • 0

補足



「csh シェル名」とする場合は、シェルスクリプトに実行属性が
ついていなくてもcshが実行してくれます。
かりに実行属性がついていなければ当然「./シェル名」としても
実行されません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2006/10/31 20:10

> シェル名だけ「シェル名」だけで実行できたり「./シェル名」としないと


> 実行できなかったりしますが、この違いはどこからくるのでしょうか?

#1 さんが回答されているとおりですが,'.' をパスに入れ忘れているのではなく,
意図的にパスから外しているとすれば,それはセキュリティ上の配慮です.

'.' がパスに含まれていると,たまたま訪れたディレクトリにある
得体の知れないコマンドをうっかり実行してしまうおそれがあります.
(特に既存のコマンドと同名のコマンドがそこにある (仕掛けられている) 場合)

パスに登録されるディレクトリがすべて絶対パスで指定されており,
かつそれらが信頼できるユーザしか書き込めないディレクトリであれば,
そのような危険は少なくなります.


> また、「csh シェル名」とするばあい

「csh シェルスクリプト名」だと,そのシェルスクリプトに
実行権がなくても読み出し可能なら実行できます.

なので,実行権が設定されておらず,設定しようとしても変更できない
他人のファイルや CD-ROM 上のファイルを実行する場合などに便利です.
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2006/10/31 20:09

シェルが配置されているディレクトリのパスが通っているか通ってないかの違いだと思います。



パスが通っていれば、./無しで実行できますし、パスが通ってなければ
明示的にシェルの場所を指定する必要があるからです。

csh シェル名の場合は、スクリプトがcshで書かれてるのではないでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2006/10/31 16:14

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

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

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

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

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に問題がないことを意味しませ...続きを読む

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

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

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

Aベストアンサー

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

Q「照合パターンに合いません」の回避法

ディレクトリ/test内のファイルをリストアップして
配列に格納するためにcshスクリプトにて
set LIST=( /test/* )
とすると、ディレクトリが空の場合
setコマンドが「照合パターンに合いません」
というエラーを吐きます。このエラーが起きると
シェルスクリプト内で返値を拾ってエラー対処することも
できず、スクリプトが落ちます。これを何とか回避する
方法はないでしょうか?

前もってlsやfindでディレクトリの中身が空でないことを
調べるというのは却下です。

Aベストアンサー

却下という言葉をお使いなので、質問者様がどれだけ偉い方かは分かりませんが、お使いのシェル(csh系と思われます)で"set nonomatch"というオプションが指定できるのであれば、「照合パターンに合いません」というエラーは出なくなります。
但し、ディレクトリが空の場合はシェル変数LISTに"/test/*"が入ることになりますので、何らかの処理で除く必要はあります。

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

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

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

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

Aベストアンサー

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

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

QCシェルでのファイルからの入力について

あるファイルが最終行になるまでに繰り返し実行するシェルを作りたいです。
とりあえずファイル名を1行ごとに5行程度入れてあるファイル「filemei」を作成しました。
そのファイルからファイル名を順番に取り出し、lsをするものを作ってみたのですが、うまくいきません。
とりあえず、繰り返しにはwhileやforeach、ファイルの読み込みにはawkを使ってみたのですが...
どなたか分かるかたがいれば教えて下さい。
無知なので、質問自体が訳が分からない場合があると思いますが、ご勘弁願います。

Aベストアンサー

とりあえず、
set a = $<
で、標準入力からの入力が一行、変数aに入ります。
例えば入力が
abcde 12345
であれば
$a = ( abcde 12345 )
となります。
abcde, 12345 はそれぞれ
$a[1], $a[2]
で参照できます。
ですから、
 while ( 条件 )
  set line = $<
  $line を処理
 end
のようにすれば、標準入力からの入力を一行ずつ処理できます。
これを例えばcommandというスクリプトにして
command < file
のようにすれば、指定したファイルからの入力を一行ずつ処理できます。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

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

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

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

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

Aベストアンサー

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

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

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。


人気Q&Aランキング