Вам не хватает workdir=
:
Каталоги
Наложение в основном включает каталоги. Если данное имя встречается как в верхней, так и в нижней файловой системе и ссылается на недиректорию в любой из них, то нижний объект скрывается - имя ссылается только на верхний объект.
Если и верхний, и нижний объекты являются каталогами, формируется объединенный каталог.
Во время
mount
два каталога, заданные в качестве опций mount lowerdir и upperdir, объединяются в объединенный каталог:mount -t overlay overlay -olowerdir=/lower,upperdir=/upper, workdir=/work /merged
workdir должен быть пустым каталогом в той же файловой системе, что и upperdir.
Затем, когда запрашивается поиск в таком объединенном каталоге, поиск выполняется в каждом реальном каталоге, а объединенный результат кэшируется в дентри, принадлежащем оверлейной файловой системе. Если оба фактических поиска находят каталоги, оба сохраняются и создается объединенный каталог, иначе сохраняется только один: верхний, если он существует, иначе нижний.
Объединяются только списки имен из каталогов. Прочее содержимое, такое как метаданные и расширенные атрибуты, сообщается только для верхнего каталога. Эти атрибуты нижнего каталога скрыты.
Несколько нижних уровней
Теперь можно задавать несколько нижних уровней, используя двоеточие
:
в качестве символа-разделителя между именами каталогов. Например:mount -t overlay overlay -olowerdir=/lower1:/lower2:/lower3 /merged
Как показано в примере,
upperdir=
иworkdir=
могут быть опущены. В этом случае оверлей будет доступен только для чтения.Указанные нижние каталоги будут сложены в стопку, начиная с самого правого и двигаясь влево. В приведенном выше примере lower1 будет верхним, lower2 - средним и lower3 - нижним слоем.
Да,man ls
(для GNU ls )содержит:
2 if serious trouble (e.g., cannot access command-line argument).
Вероятно, слово access
следует читать как stat
. Аргумент (файл ), который не может быть stat (stat filename
), поскольку он не существует, будет генерировать код ошибки 2
.
Короче говоря,для GNUls
:Команда типа:
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
Для GNU ls
используйте источник Luke: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
в коде, вы узнаете о разных случаях:
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_length
будет реагировать в зависимости от того, как xstrtoumax
возвращается для заданной ширины. Если вы внимательно посмотрите на его исходный код, вы можете прийти к некоторым пограничным случаям :
$ ls -w -1 >& /dev/null
$ echo $?
2
$ ls -w 1 >& /dev/null
$ echo $?
0
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
2106 default:
2107 usage (LS_FAILURE);
Так что это код ошибки по умолчанию, если вы указываете недопустимые параметры. См. этот пример:
$ ls --unknown-option >& /dev/null
$ echo $?
2
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
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
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 }
Это (серьезное = истинное )может произойти в нескольких случаях, например, если где-то есть петля:
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
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
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);
Это какой-то каталог, недоступный для доступа (, например, удаленный ).
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 }
Это неработающие жесткие/мягкие ссылки.
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);
Другой случай, когда невозможно прочитать содержимое каталога (, если оно указано в командной строке)
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