rm -rf kody powrotu

9

Każdy może dać mi znać możliwe kody powrotu dla polecenia rm -rf inne niż zero, tj. Możliwe kody powrotu dla przypadków awarii. Chcę poznać bardziej szczegółowy powód niepowodzenia polecenia, inaczej niż polecenie nie powiodło się (powrót inny niż 0).


źródło
3
@ ØHankyPankyØ Tak naprawdę jestem zaskoczony, że strona podręcznika rm nie opisuje możliwych kodów statusu wyjścia. Jeśli korzystasz man lsz systemu Ubuntu, wyjaśnia on powód niezerowego statusu wyjścia
SheetJS
Jest to wartość większa niż 0. W przypadku błędu.
Arun
6
Nie zgadzam się z migracją z SO, ponieważ OP jest zainteresowany kodami powrotu, jest bardzo prawdopodobne, że jest to problem dotyczący skryptów / programowania.
Adrian Frühwirth,
nawiasem mówiąc, interesuje mnie liczba scenariuszy, które może zwrócić. Czy będzie to zależne od systemu operacyjnego?
trochę wkurzony na samą migrację ... prawie dostałem osiągnięcie cofnięcia = P
Matt Joyce

Odpowiedzi:

8

Aby zobaczyć kod powrotu, możesz użyć echo $?w bash.

Aby zobaczyć rzeczywiste znaczenie, niektóre platformy (takie jak Debian Linux) mają perrordostępne pliki binarne, których można użyć w następujący sposób:

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

rm -rfautomatycznie pomija większość błędów. Najbardziej prawdopodobnym błędem, jaki zobaczysz, jest 1(Operacja niedozwolona), która wystąpi, jeśli nie masz uprawnień do usunięcia pliku. -fcelowo pomija większość błędów

SheetJS
źródło
3
+1 za wzmiankę perror. W moim systemie jest dostarczany z mysql.
Adrian Frühwirth
może mieć więcej szczęścia dzięki strace w zakresie diagnostyki.
Matt Joyce,
@MattJoyce poinformuje stracecię, jeśli wywołanie systemowe nie powiedzie się, ale dopóki nie spojrzysz na źródło, nie wiesz, jak syscall odnosi się do statusu wyjścia z programu (na przykład, jeśli się uruchomisz -f, ENOENTzostanie pominięty). Dlatego nie ma to tutaj znaczenia
ArkuszJS
1
@MattJoyce istnieje różnica między awarią syscall a programem zgłaszającym błąd, a pytanie dotyczy statusu wyjścia z programu.
ArkuszJS
1
Prawdziwe. Pamiętaj, że patrzysz na źródło rm ... naprawdę niewiele się tam dzieje.
Matt Joyce,
2

złapałem coreutils z git ...

patrząc na wyjście widzimy ...

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);

Teraz patrząc na zmienną statusu ....

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);

wygląda na to, że niewiele się tam dzieje ze statusem wyjścia.

Widzę EXIT_FAILURE i EXIT_SUCCESS i nic więcej.

więc w zasadzie 0 i 1 / -1

Aby zobaczyć określone wywołania systemowe exit () i sposób ich występowania w przepływie procesu, wypróbuj to

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

dość proste.

ref:

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

Matt Joyce
źródło
Nie rozumiem dlaczego, +1 ode mnie. POSIX też tylko tak naprawdę mówi 0 / >0.
Adrian Frühwirth
2
Chociaż może to częściowo mieć rację, nie odpowiada na pytanie PO, I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)więc głosy w dół są zrozumiałe.
Prix
1
@ AdrianFrühwirth EXIT_FAILURE wynosi 1: „W systemach POSIX wartość tego makra wynosi 1” ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS
Adrian odnosił się do EXIT_FAILURE, a nawet strona linuxowa sugeruje, że może być inny na innych platformach. więc pomyślałem, że też to zasugeruję.
Matt Joyce,
1
komunikaty o błędach, których szukasz, znajdują się w rzeczywistym kodzie pliku usuwania ... dla busyboksa możesz załatać git.busybox.net/busybox/tree/libbb/remove_file.c ... dla każdego if (!(flags & FILEUTILS_FORCE)) {dodania else{printf("same error message as perror");}i jestem pewien, że inne implementacje by być podobne, ale jeśli nie, wersję busyboksa można zbudować samodzielnie i dołączyć.
technozaur