저는 사용자 정의 셸을 작성 중이고 자체 셸을 사용하여 셸 스크립트를 실행하고 싶습니다. 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
내 쉘에는 조건문을 허용하는 기능도 있으므로 if
if 문에서 종료 코드 0 또는 1을 사용할 수 있으면 변수를 더 적게 또는 그 이상으로 설정할 수 있으며 모든 것이 제대로 작동합니다. 그러면 내장 함수의 종료 코드는 무엇이어야 할까요? 0은 발견됨(성공)을 의미하고, 1은 발견되지 않음을 의미하며, 그 반대의 경우도 마찬가지입니다. 제가 고려해야 할 다른 사항이 있나요?do_type
PAGER
type
답변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_SUCCESS
return
return 1
return false
만약에
if
전달된 명령의 반환 값은 다음과 같이 평가됩니다. 명령이 반환되면 0
true로 처리되고 명령이 실행된 블록 then
이외의 것을 반환하면 (블록이 존재한다고 가정) 블록이 실행됩니다.0
else
따라서 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.