あなたのスクリプトは 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
が原因である可能性があります。