사례 1

사례 1

나는 ls man을 읽고 있는데 마지막에는 ls의 종료 상태에 대해 이야기합니다. 그것은 말한다:

   Exit status:
   0      if OK,
   1      if minor problems (e.g., cannot access subdirectory),
   2      if serious trouble (e.g., cannot access command-line argument).

그러나 문제는 그들이 의미하는 바를 이해하지 못한다는 것입니다.

명령줄 매개변수에 액세스할 수 없습니다.

프로그램에 전달된 매개변수에 액세스할 수 없는 상황을 겪어본 적이 없으며, 이 특정 상황에 대한 정보를 온라인에서 검색했지만 그 외에는 많은 정보를 얻을 수 없습니다.이 웹사이트 이것은 나에게 명확하지 않으며 오류를 재현할 수 없습니다. MAN 이해 페이지를 놓쳤는지 잘 모르겠습니다.

답변1

GNU의 경우 lsLuke 소스를 사용하세요.http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=blob;f=src/ls.c;h=bf0c5941d7de699fc5a85d44461ef29192216d9d;hb=HEAD

대부분의 경우 반환 코드는 2이고 아래와 같이 쉽게 트리거되는 경우도 있습니다.

먼저 다음을 읽을 수 있습니다.

 802 /* Exit statuses.  */
 803 enum
 804   {
 805     /* "ls" had a minor problem.  E.g., while processing a directory,
 806        ls obtained the name of an entry via readdir, yet was later
 807        unable to stat that name.  This happens when listing a directory
 808        in which entries are actively being removed or renamed.  */
 809     LS_MINOR_PROBLEM = 1,
 810 
 811     /* "ls" had more serious trouble (e.g., memory exhausted, invalid
 812        option or failure to stat a command line argument.  */
 813     LS_FAILURE = 2
 814   };

따라서 값 2가 문서에 작성된 것보다 더 많은 경우를 포함한다는 것을 이미 알 수 있습니다.

그런 다음 코드를 더 자세히 검색하면 LS_FAILURE다른 상황을 발견할 수 있습니다.

사례 1

1896         case 'w':
1897           if (! set_line_length (optarg))
1898             die (LS_FAILURE, 0, "%s: %s", _("invalid line width"),
1899                  quote (optarg));
1900           break;

set_line_lengthxstrtoumax주어진 너비가 반환되는 방식 에 따라 반응합니다 . 소스 코드를 자세히 살펴보면 몇 가지 극단적인 경우를 얻을 수 있습니다.

$ ls -w -1 >& /dev/null
$ echo $?
2
$ ls -w 1 >& /dev/null
$ echo $?
0

사례 2

1964         case 'T':
1965           tabsize = xnumtoumax (optarg, 0, 0, SIZE_MAX, "",
1966                                 _("invalid tab size"), LS_FAILURE);
1967           break;

이전 사례와 유사합니다.

$ ls -T 1 >& /dev/null
$ echo $?
0
$ ls -T -1 >& /dev/null
$ echo $?
2

사례 3

2106         default:
2107           usage (LS_FAILURE);

따라서 잘못된 매개변수를 제공하는 경우 이는 기본 오류 코드입니다. 이 예를 보세요:

$ ls --unknown-option >& /dev/null
$ echo $?
2

사례 4

2198               if (strchr (p1 + 1, '\n'))
2199                 die (LS_FAILURE, 0, _("invalid time style format %s"),
2200                      quote (p0));

잘못된 시간 형식(두 가지가 있음)을 제공하면 이런 일이 발생합니다 \n.

$ ls -l --time-style=+%T >& /dev/null ; echo $?
0
$ ls -l --time-style=+%T$'\n' >& /dev/null ; echo $?
0
$ ls -l --time-style=+%T$'\n'%T >& /dev/null ; echo $?
0
$ ls -l --time-style=+%T$'\n'%T$'\n' >& /dev/null ; echo $?
2

사례 5

2218               /* The following is a manual expansion of argmatch_valid,
2219                  but with the added "+ ..." description and the [posix-]
2220                  prefixes prepended.  Note that this simplification works
2221                  only because all four existing time_style_types values
2222                  are distinct.  */
2223               fputs (_("Valid arguments are:\n"), stderr);
2224               char const *const *p = time_style_args;
2225               while (*p)
2226                 fprintf (stderr, "  - [posix-]%s\n", *p++);
2227               fputs (_("  - +FORMAT (e.g., +%H:%M) for a 'date'-style"
2228                        " format\n"), stderr);
2229               usage (LS_FAILURE);

잘못된 시간 형식 이름이 사용될 때 발생합니다.

$ LANG=C ls -l --time-style=whatever 
ls: invalid argument 'whatever' for 'time style'
Valid arguments are:
  - [posix-]full-iso
  - [posix-]long-iso
  - [posix-]iso
  - [posix-]locale
  - +FORMAT (e.g., +%H:%M) for a 'date'-style format
Try 'ls --help' for more information.

$ echo $?
2

사례 6

2669 static void
2670 set_exit_status (bool serious)
2671 {
2672   if (serious)
2673     exit_status = LS_FAILURE;
2674   else if (exit_status == EXIT_SUCCESS)
2675     exit_status = LS_MINOR_PROBLEM;
2676 }

이 상황(중요 = true)은 여러 상황에서 발생할 수 있습니다. 예를 들어 어딘가에 루프가 있는 경우입니다.

2747       /* If we've already visited this dev/inode pair, warn that
2748          we've found a loop, and do not process this directory.  */
2749       if (visit_dir (dir_stat.st_dev, dir_stat.st_ino))
2750         {
2751           error (0, 0, _("%s: not listing already-listed directory"),
2752                  quotef (name));
2753           closedir (dirp);
2754           set_exit_status (true);
2755           return;
2756         }

주장에 따르면 이는 다른 많은 상황에서도 발생할 수 있습니다. file_failure첫 번째 매개변수는 전달된 부울 값입니다.set_exit_status

하위 사례 A

2710 /* Read directory NAME, and list the files in it.
2711    If REALNAME is nonzero, print its name instead of NAME;
2712    this is used for symbolic links to directories.
2713    COMMAND_LINE_ARG means this directory was mentioned on the command line.  */

...

2725   if (!dirp)
2726     {
2727       file_failure (command_line_arg, _("cannot open directory %s"), name);
2728       return;
2729     }

예를 들어:

$ ls /thatDOESnotEXIST >& /dev/null
$ echo $?
2

하위 사례 B

2736       /* If dirfd failed, endure the overhead of using stat.  */
2737       if ((0 <= fd
2738            ? fstat (fd, &dir_stat)
2739            : stat (name, &dir_stat)) < 0)
2740         {
2741           file_failure (command_line_arg,
2742                         _("cannot determine device and inode of %s"), name);

이는 일종의 액세스할 수 없는 디렉터리(예: 원격 디렉터리)입니다.

하위 사례 C

2771       if (print_hyperlink)
2772         {
2773           absolute_name = canonicalize_filename_mode (name, CAN_MISSING);
2774           if (! absolute_name)
2775             file_failure (command_line_arg,
2776                           _("error canonicalizing %s"), name);

또는

3189       if (print_hyperlink)
3190         {
3191           f->absolute_name = canonicalize_filename_mode (full_name,
3192                                                          CAN_MISSING);
3193           if (! f->absolute_name)
3194             file_failure (command_line_arg,
3195                           _("error canonicalizing %s"), full_name);

또는

3450 static void
3451 get_link_name (char const *filename, struct fileinfo *f, bool command_line_arg)
3452 {
3453   f->linkname = areadlink_with_size (filename, f->stat.st_size);
3454   if (f->linkname == NULL)
3455     file_failure (command_line_arg, _("cannot read symbolic link %s"),
3456                   filename);
3457 }

이것은 일종의 깨진 하드/소프트 링크입니다.

하위 사례 D

2836       else if (errno != 0)
2837         {
2838           file_failure (command_line_arg, _("reading directory %s"), name);

또는

2851   if (closedir (dirp) != 0)
2852     {
2853       file_failure (command_line_arg, _("closing directory %s"), name);

또 다른 경우는 디렉터리 내용을 읽을 수 없다는 것입니다(명령줄에 제공된 경우).

하위 사례 E

3235       if (err != 0)
3236         {
3237           /* Failure to stat a command line argument leads to
3238              an exit status of 2.  For other files, stat failure
3239              provokes an exit status of 1.  */
3240           file_failure (command_line_arg,
3241                         _("cannot access %s"), full_name);

이는 파일을 일치시키려고 할 때 발생합니다. 예를 들면 다음과 같습니다.

$ ls '*DOESnotEXIST*' >& /dev/null
$ echo $?
2

답변2

예, man ls(GNU ls의 경우) 다음이 포함됩니다:

2 심각한 문제가 발생한 경우(예: 명령줄 매개변수에 액세스할 수 없음)

아마도 이 단어 access는 로 읽어야 할 것입니다 stat. 존재하지 않기 때문에 stat()할 수 없는 인수(파일)는 stat filename오류 코드를 생성합니다 2.

간단히 말해서 GNU의 경우 ls명령은 다음과 같습니다.

ls   NONE_existent_file    # will result in exit 2

노력하다:

ls nofile
ls: cannot access nofile: No such file or directory
echo $?
2

아니면 다음을 시도해 보세요.

$ ls $(date); echo "exit status: $?"
ls: cannot access 'Wed': No such file or directory
ls: cannot access 'Oct': No such file or directory
ls: cannot access '24': No such file or directory
ls: cannot access '02:42:02': No such file or directory
ls: cannot access 'UTC': No such file or directory
ls: cannot access '2018': No such file or directory
exit status: 2

관련 정보