내장 셸 명령의 종료 코드 [닫기]

내장 셸 명령의 종료 코드 [닫기]

저는 사용자 정의 셸을 작성 중이고 자체 셸을 사용하여 셸 스크립트를 실행하고 싶습니다. less 프로그램이 설치 되어 있는지 확인하려고 하는데, 그렇다면 less 프로그램을 사용하고 그렇지 않으면 more.type

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_FAILURE.EXIT_SUCCESS

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

이는 UNIX 프로그램의 일반적인 동작입니다. man type여기에서도 유용합니다 type.POSIX 명령:

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");
}

답변2

help type쉘 에서 bash:

type: type [-afptP] name [name ...]
    Display information about command type.

    For each NAME, indicate how it would be interpreted if used as a
    command name.
    ...
    Exit Status:
    Returns success if all of the NAMEs are found; fails if any are not found.

관련 정보