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

shell  unix 

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


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/


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.