rm -rf коди повернення


9

Будь-хто може повідомити мені можливі коди повернення для команди rm -rf, крім нуля, тобто можливі коди повернення для випадків відмов. Я хочу знати більш детальну причину відмови команди на відміну від просто команди не вдалося (повернення, крім 0).

shell  unix 

3
@ ØHankyPankyØ Насправді я здивований, що на РМ-сторінці не описані можливі коди статусу виходу. Якщо ви перебуваєте man lsна Ubuntu, це пояснює причину ненульового статусу виходу
SheetJS

Його значення більше 0. У разі помилки
Арун

6
Я не погоджуюся з міграцією з SO, оскільки ОП зацікавлена ​​у кодах повернення, дуже ймовірно, що це питання сценарію / програмування.
Адріан Фрюхвірт

до речі, мене цікавить кількість сценаріїв, які вона може повернути. Чи буде це залежно від ОС?

свого роду пісав про міграцію сам ... майже здобув зворотне досягнення = 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навмисно пригнічує більшість помилок


3
+1 для згадки perror. У моїй системі він постачається з mysql.
Адріан Фрюхвірт

можливо, пощастить з прошарком в плані діагностики.
Метт Джойс

@MattJoyce straceповідомляє, якщо системний виклик не працює, але якщо ви не подивитесь на джерело, ви не знаєте, як syscall стосується стану виходу з програми (наприклад, якщо ви запускаєтесь -f, ENOENTпридушується). Отже, це не актуально
SheetJS

1
@MattJoyce є різниця між помилкою виклику syscall та програмою, яка повідомляє про помилку, і питання про стан виходу з програми.
SheetJS

1
Правда. Зауважте, що ви шукаєте джерело для Rm ... там насправді не так багато.
Метт Джойс

2

схопив coreutils від git ....

дивлячись на вихід, ми бачимо ...

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");}я впевнений, що інші реалізації бути схожим, але як не версія зайнятої скриньки, то вона може бути створена самостійно і включена.
технозавр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.