私のCコードで単純なシェルスクリプトを実行しようとしています。
単純化のために他のすべてを削除しました。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#define SHELL "/bin/sh"
int main()
{
execl("/home/amir/Desktop/OSAssignment/script.sh","script.sh",NULL);
return 0;
}
私のCプログラムとscript.shはDesktop->OSAssignment->にあります。
プログラムをコンパイルして実行しましたが、何も表示されません(execコマンドの下または上にprintfステートメントを置くと正常に印刷されます)。
これは私のシェルスクリプトファイルです
echo "Hi"
答え1
明示的なインタプリタなしで実行されたスクリプトは実行可能であり、正しい#!
-line を持っている必要があります。
-lineが存在しない#!
か実行できない場合は、インタプリタを使用して次のようにスクリプトを実行する必要があります。
sh /path/to/script.sh
execl()
また、呼び出しが失敗したことを確認するには、戻りコードを確認する必要があります。失敗した場合は、perror()
エラーメッセージの印刷を使用できます。perror
システムのマニュアルを参照してください。
答え2
次の記事を読む実行(3)そして実行(2)(によって呼び出されますexecl
)。失敗する可能性があります(これが返す唯一の方法です。これらの関数は、プロセスの仮想アドレス空間全体を変更するため、成功すると返されません)。
だからコードは(使用してエラー(3)):
execl("/home/amir/Desktop/OSAssignment/script.sh","script.sh",NULL);
perror("execl script.sh");
スクリプトを実行可能にし、次に終了する必要があります。シェルボーン。最初の行は次のようになります。#!/bin/sh
使用する各機能の説明書をよくお読みください。