0

入力引数を取る 2 つの (Ubuntu Linux) bash スクリプトがあります。それらは同時に実行する必要があります。execve私は引数で試しました。

char *argv[10] = { "/mnt/hgfs/F/working/script.sh", "file1", "file2", NULL };

execve(argv[0], argv, NULL)

$0しかし、bash スクリプトは、たとえば, $1, で引数を見つけることができないようです$2

printf "gcc -c ./%s.c -o ./%s.o\n" $1 $1;
gcc -c ./$1.c -o ./$1.o -g
exit 0;

出力はgcc -c ./main.c -o ./main.o 次のような多くのエラーです/usr/include/libio.h:53:21: error: stdarg.h: No such file or directory

何が欠けていますか?

4

1 に答える 1

5

あなたのスクリプトは hashbang 行で始まりますか? 次のようなものは必須だと思います。

#!/bin/bash

たとえば、次の C プログラムを参照してください。

#include <stdio.h>
#include <unistd.h>

char *argv[10] = { "./qq.sh", "file1", NULL };
int main (void) {
    int rc = execve (argv[0], argv, NULL);
    printf ("rc = %d\n", rc);
   return 0;
}

これをコンパイルして次のqq.shファイルで実行すると、次のように出力されますrc = -1

echo $1

ファイルを次のように変更すると:

#!/bin/bash
echo $1

それは出力します:

file1

予想通り。


他に注意する必要があるのは、これらの VMWare 共有フォルダーの使用/mnt/hgfsです。ファイルが Windows タイプのエディタで作成された場合、「DOS」行末がcarriage-return/line-feed- である可能性があり、これがスクリプトの実行に問題を引き起こしている可能性があります。

これを確認するには、次を実行します。

od -xcb /mnt/hgfs/F/working/script.sh

\r文字が表示されるかどうかを確認します。

たとえば、hashbang 行を含むシェル スクリプトを使用すると (ただし、行に改行を追加します)、出力得られrc = -1ます。つまり、シェルが見つからないということです。


そして、編集に基づいて、スクリプトは引数をまったく問題なく解釈できるようになりました。それが出力するという事実:

gcc -c ./main.c -o ./main.o

$1と見なされているため、これが肯定的な証拠mainです。

あなたが実際に抱えている問題は、コンパイラstrdarg.h動作しているが、ファイルからインクルードされていることが見つからないということです.これは、それらの引数を見ることができるlibio.hかどうかとは関係ありません.bash

私の提案は、そのコマンドで手動でコンパイルして、同じエラーが発生するかどうかを確認することです。もしそうなら、それは問題ではなく、コンパイルしようとしているものの問題bashですexec

正常にコンパイルされる場合は、呼び出しで環境変数が破壊されたことexecveが原因である可能性があります。

于 2013-02-10T04:53:19.737 に答える