組み込みシェルコマンドの終了コード [閉じる]

組み込みシェルコマンドの終了コード [閉じる]

私はカスタムシェルを作成しており、独自のシェルを使用してシェルスクリプトを実行したいと思います。 lessプログラムがインストールされていることを確認しようとしていますが、そうであればlessプログラムを使用し、そうでなければmoretype

int do_type(int argc, const char **argv) {
    bool found = false;
    char *curr_path;
    char *path;
    char *path_strdup;
    char *path_value;
    char *pathValue;
    pid_t pid;
    pathValue = getenv("PATH");
    path_strdup = strdup(pathValue);
    if (path_strdup == NULL) {
        perror("strdup");
        exit(EXIT_FAILURE);
    }
    path_value = strtok(path_strdup, ":");
    path = path_value;
    while (path && !found) {
        if ((curr_path = malloc(strlen(path) + sizeof(argv[1]))) != NULL) {
            if (curr_path == NULL) {
                fprintf(stderr, "malloc failed!\n");

            }
            strcpy(curr_path, path);
            strcat(curr_path, argv[1]);
            if (file_exist(curr_path)) {
                found = true; // we found the program
            }
            //free(curr_path);
            path = strtok(NULL, ":");
        } else {
            fprintf(stderr, "malloc failed!\n");
            return false;
        }
    }
    if (found)
        printf("%s\n", curr_path, found);
    else
        printf("%s: not found\n", argv[1]);
    return 1;
}

lessシェルでコードを実行すると、aboceコードがプログラムを見つけます(インストールされている場合)。

$ type /blaha
/blaha: not found
$ type /less
/usr/bin/less
$ type /godoc
/usr/local/go/bin/godoc
$ 

今確認方法を知りたいです。私のシェルが実行する必要があるスクリプトを作成しました。

type less > /dev/null
printenv|grep $1|$PAGER

私のシェルには条件ステートメントを許可する機能もあるので、ififステートメントで終了コード0または1を使用できる場合は、変数をより少なくまたはそれ以上に設定でき、すべてが正しく機能します。それでは、組み込み関数の終了コードは何ですか? 0は見つかった(成功)を意味し、1は見つからないことを意味し、その逆も同様です。私が考慮すべき他のことがありますか?do_typePAGERtype

ベストアンサー1

戻り値

あなたEXIT_FAILUREのコードの対応するstdlib.hヘッダーファイルにEXIT_FAILUREEXIT_SUCCESS

#define EXIT_FAILURE    1       /* Failing exit status.  */
#define EXIT_SUCCESS    0       /* Successful exit status.  */

これはUNIXプログラムの一般的な動作です。 man typeここでも便利ですtypePOSIX コマンド:

EXIT STATUS
       The following exit values shall be returned:

        0    Successful completion.

       >0    An error occurred.

はい。失敗した場合に1を返すのはtype正確で予想される動作です。

EXIT_FAILUREまた、やや混乱したandの代わりにandを使用する方が良いです。EXIT_SUCCESSreturnreturn 1return false


もし

if渡されたコマンドの戻り値は、次のように評価されます。コマンドが返された場合は0trueとして処理され、コマンドが実行されたブロックthen以外を返すと(ブロックが存在すると仮定)、ブロックが実行されます。0else

したがって、type(成功した場合は0を返し、失敗した場合は1を返す)は期待どおりに機能するはずです。

if type less > /dev/null
then
    echo less exists
else
    echo no less we need to use more
fi

もう一つのことは、あなたのコードでこの部分が心配されることです。

if ((curr_path = malloc(strlen(path) + sizeof(argv[1]))) != NULL) {
    if (curr_path == NULL) {
        fprintf(stderr, "malloc failed!\n");

    }

その瞬間はif決してできません。curr_path != NULLテスト中のみ外部ブロックに入ることができますcurr_path == NULL。私はあなたがこれをしたいと思います:

if ((curr_path = malloc(strlen(path) + sizeof(argv[1]))) != NULL) {
    ...  /* the actual path matching */
}
else {
    fprintf(stderr, "malloc failed!\n");
}

おすすめ記事