1

指定されたコマンドのフル パスを知らなくても、どの exec システム コール ファミリー メンバーを使用できるか。たとえば、

"/bin/ls -t" "/bin/cat -n" "/usr/bin/tr /a-z/ /A-Z/" 

コマンドラインから与えられた入力は、このように execv(arg[0],args) を適切に使用できます

(arg[0] -> full path of the command and args -> arguments of the command)  

しかし、「ls /sbin」「wc -w」「cat」入力があると、execv を使用できません。

4

2 に答える 2

4

関数名を見ると、これはシェルスクリプトではなく、POSIX の通常の C であると思います。

C では、execlp() または execvp() 関数を使用できます。余分な'p'は、指定された実行可能ファイルを見つけるために PATH 環境変数が使用されることを意味します。

例えば:

    execlp("ls", "ls", "-t");

それ以外の:

    execl("/bin/ls", "ls", "-t");
于 2014-09-30T22:30:56.417 に答える
0

PATH実行可能ファイルが環境変数内にある場合、すべての「家族」でそれを行うことができます。その変数は、実行可能ファイルが実行されるときに検索されるパスのコロンで区切られたリストを保持できます。したがって、その変数を正しく設定するだけです。一般的なセットアップには次のパスが含まれます

  • ~/bin (現在のユーザーの bin フォルダー)
  • . (現在のディレクトリ)
  • /置き場
  • /usr/ビン
  • /usr/ローカル/ビン

問題のコマンドを実際に実行するユーザー アカウントに注意する必要があることに注意してください。これは動的に変更できます。その場合、呼び出しスコープの環境内ではなく、別の PATH 変数である可能性があります。ただし、通常、環境はサブプロセスに完全に引き渡されます。これは、最初に PATH 変数を設定して「エクスポート」し、次に呼び出して、呼び出されたスコープによって継承されることを意味します。

何らかの理由でその環境変数を使用できない場合は、何らかの方法でその動作をエミュレートする必要があります: 一部の実行可能ファイルの場所は、exec 呼び出しまたはシェルによって魔法のように推測できないため、場所がわかっている必要があるか、場所が既知である必要があります。検索しました。したがって、そのような検索アルゴリズムを実装する必要があります。最終的なコマンドを実際に実行するために使用する最小限のシェル(通常は「ラッパー」と呼ばれます)内で実行する場合があります。したがって、ラッパーを呼び出し、実行するコマンドを引数として渡し、コマンドを検索する場所がわかっているラッパーを渡します。しかし、これはまさにPATH 変数が存在する目的です。

別のオプションは、必要な実行可能ファイルを検索するために PATH 変数とシェル アルゴリズムに依存することですが、それは手動で行います。これがwhereisおよびwhichコマンドの目的です。man ページを参照してください。どちらも PATH 変数を検索し、一致を返すことができます。したがって、最初に目的の実行可能ファイルの絶対場所を照会してから、その絶対パスで呼び出すことができます。

于 2014-04-05T17:09:10.133 に答える