linuxのgccでコンパイルしたcプログラムは./をつけて動かしますが、通常コマンドのように./なしで動かす方法はありますか? その周辺の概念だどもよければ教えてください

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/12/14 00:18:28
  • 終了:2011/12/14 00:48:09

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4563ベストアンサー獲得回数19082011/12/14 00:38:41

ポイント100pt

実行するプログラムがどこに置かれているかは、ログインシェルが環境変数 PATH (csh 系では path シェル変数) を使って探します。
PATH に . を入れておけば、./hoge とやらなくても、hoge で起動することができます。

id:mash76

あ、パスが通ってないだけですね。ありがとうございます。解説サイトで「cプログラムを実行するには./をつけます」みたいな書き方だったので先入観持ってました・・。

2011/12/14 00:47:52
  • id:cdaotg
    余談ですが、カレントディレクトリ(.)にパスを通すのは、多人数で共有するマシンではセキュリティ上好ましくないです。
    例えば/tmpに悪意を持ったプログラムがlsとかcdとかって名前で置かれていると、/tmpに移動して何かコマンドを実行しようとした際に、その悪意を持ったプログラムを実行してしまう恐れがあります。
    個人所有のマシンではそこまで気にする必要は無いかもしれませんが、一応その辺りも考慮して設定される事をお勧めします。
  • id:mash76
    ありがとうございます。実際は原理がわかって良かったという感じですので、開発dirで./して動かしてます。
  • id:xnissy
    私がかつて悩んだ問題。
    test.cというプログラムをつくってコンパイルし、testという実行ファイルができた。ところが
    % test
    としても、全然思うような出力結果が返ってこない。実は、カレントディレクトリのtestではなく、/bin/test が実行されていたんですね。
    % ./test
    のようにパスを指定するクセをつけておけば、こういうことにはならなかったのです。
  • id:JULY
    更に補足すると、この話は C でネイティブなバイナリを実行する時の話だけでなく、シェルスクリプトや、Perl、Python などスクリプトでも同じです。

    ・実行権限の付いたファイルがあるかどうかを、PATH に従って探す。
    ・実行権限の付いたファイルがあったら、そのファイルの先頭数バイトを読んで、
     ・ネイティブなバイナリの実行ファイルだったら、そのファイルを実行。
     ・先頭が「#!」となっていたら、その後ろに書かれているファイルに対して、
      このファイルのファイル名をコマンドラインの引数に指定して実行。
  • id:a-kuma3
    >実は、カレントディレクトリのtestではなく、/bin/test が実行されていた
    あー、unix あるある、かも。

    ・test なんてコマンドがあるんだー
    ・[ が test の別名なんじゃん
    ・if は、コマンドの返却値がゼロのときに真なのか
    ・if grep ... なんて書けるんだねー

    という、教育的な罠だと思います =)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません