rm -rf коды возврата

9

Любой может сообщить мне возможные коды возврата для команды rm -rf, отличные от нуля, т. Е. Возможные коды возврата для случаев сбоя. Я хочу узнать более подробную причину сбоя команды, в отличие от просто сбой команды (возврат, отличный от 0).


источник
3
@ ØHankyPankyØ Я на самом деле удивлен, что на странице man rm не описаны возможные коды состояния выхода. Если вы man lsв Ubuntu, это объясняет причину ненулевого статуса выхода
SheetJS
Это значение больше 0. В случае ошибки.
Арун
6
Я не согласен с миграцией из SO, так как OP интересуется кодами возврата, вполне вероятно, что это проблема сценариев / программирования.
Адриан Фрувирт
кстати, меня интересует количество сценариев, которые он может вернуть. Будет ли это зависеть от ОС?
вроде как разозлился из-за миграции сам… почти получил достижение разворота = P
Мэтт Джойс

Ответы:

8

Чтобы увидеть код возврата, вы можете использовать echo $?в bash.

Чтобы увидеть реальное значение, некоторые платформы (например, Debian Linux) имеют perrorбинарный файл, который можно использовать следующим образом:

$ rm -rf something/; perror $?
rm: cannot remove `something/': Permission denied
OS error code   1:  Operation not permitted

rm -rfавтоматически подавляет большинство ошибок. Наиболее вероятная ошибка, которую вы увидите: 1(Операция не разрешена), которая произойдет, если у вас нет прав на удаление файла. -fнамеренно подавляет большинство ошибок

SheetJS
источник
3
+1 за упоминание perror. В моей системе он поставляется с MySQL.
Адриан Фрувирт
возможно, повезет больше с strace с точки зрения диагностики.
Мэтт Джойс
@MattJoyce straceсообщает вам, если системный вызов завершился неудачно, но если вы не посмотрите на источник, вы не будете знать, как системный вызов относится к состоянию завершения программы (например, если вы запускаете -f, ENOENTподавляется). Следовательно, это не имеет отношения здесь
SheetJS
1
@MattJoyce есть разница между ошибкой системного вызова и программой, сообщающей об ошибке, и вопрос заключается в статусе завершения программы.
SheetJS
1
Правда. Имейте в виду, вы смотрите на источник для rm ... там действительно не так много происходит.
Мэтт Джойс
2

схватил coreutils из мерзавца ....

глядя на выход мы видим ...

openfly@linux-host:~/coreutils/src $ cat rm.c | grep -i exit
  if (status != EXIT_SUCCESS)
  exit (status);
  /* Since this program exits immediately after calling 'rm', rm need not
  atexit (close_stdin);
          usage (EXIT_FAILURE);
        exit (EXIT_SUCCESS);
          usage (EXIT_FAILURE);
        error (EXIT_FAILURE, errno, _("failed to get attributes of %s"),
        exit (EXIT_SUCCESS);
  exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);

Теперь смотрим на переменную состояния ....

openfly@linux-host:~/coreutils/src $ cat rm.c | grep -i status
usage (int status)
  if (status != EXIT_SUCCESS)
  exit (status);
  enum RM_status status = rm (file, &x);
  assert (VALID_STATUS (status));
  exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);

похоже, там мало что происходит со статусом выхода.

Я вижу EXIT_FAILURE и EXIT_SUCCESS и ничего больше.

так в основном 0 и 1 / -1

Чтобы увидеть конкретные системные вызовы exit () и узнать, как они происходят в потоке процесса, попробуйте

openfly@linux-host:~/ $ strace rm -rf $whatever 

довольно простой.

ссылка:

http://www.unix.com/man-page/Linux/EXIT_FAILURE/exit/

Мэтт Джойс
источник
Не понимаю почему, +1 от меня. POSIX тоже только правда говорит 0 / >0.
Адриан Фрувирт
2
Хотя это может быть частично правильно, это не отвечает на вопрос ОП, I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)так что отрицательные голоса понятны.
Приз
1
@ AdrianFrühwirth EXIT_FAILURE равно 1: «В системах POSIX значение этого макроса равно 1» ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS
Адриан, ссылка на EXIT_FAILURE, есть, и даже страница руководства Linux для него предполагает, что она может отличаться на других платформах. так что я решил, что я бы тоже это предложил.
Мэтт Джойс
1
сообщения об ошибках, которые вы ищете, находятся в фактическом коде удаления файла ... для busybox вы можете исправить git.busybox.net/busybox/tree/libbb/remove_file.c ... для каждого if (!(flags & FILEUTILS_FORCE)) {добавления, else{printf("same error message as perror");}я уверен, что другие реализации будут быть похожим, но в противном случае версия busybox могла бы быть построена сама по себе и включена.
технозавр