mã trả lại rm -rf


9

Bất kỳ ai cũng có thể cho tôi biết mã trả về có thể có cho lệnh rm -rf khác 0, tức là mã trả về có thể cho các trường hợp thất bại. Tôi muốn biết lý do chi tiết hơn cho sự thất bại của lệnh không giống như lệnh bị lỗi (trả về 0).

shell  unix 

3
@ ØHankyPankyØ Tôi thực sự ngạc nhiên khi trang rm không mô tả các mã trạng thái thoát có thể. Nếu bạn man lstrên Ubuntu, nó giải thích lý do cho trạng thái thoát khác
SheetJS

Giá trị của nó lớn hơn 0. Trong trường hợp có lỗi.
Arun

6
Tôi không đồng ý với việc di chuyển từ SO, vì OP quan tâm đến các mã trả về, rất có khả năng đây là một loại vấn đề về kịch bản / lập trình.
Adrian Frühwirth

Nhân tiện, tôi quan tâm đến số lượng kịch bản mà nó có thể trả về. Nó sẽ phụ thuộc hệ điều hành?

Bản thân tôi đã tức giận về việc di cư ... gần như đã đạt được thành tích đảo ngược = P
Matt Joyce

Câu trả lời:


8

Để xem mã trả về, bạn có thể sử dụng echo $?trong bash.

Để xem ý nghĩa thực tế, một số nền tảng (như Debian Linux) có perrorsẵn tệp nhị phân, có thể được sử dụng như sau:

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

rm -rftự động loại bỏ hầu hết các lỗi. Lỗi rất có thể bạn sẽ thấy là 1(Thao tác không được phép), lỗi này sẽ xảy ra nếu bạn không có quyền xóa tệp. -fcố ý loại bỏ hầu hết các lỗi


3
+1 để đề cập perror. Trên hệ thống của tôi, nó xuất xưởng với mysql.
Adrian Frühwirth

có thể có may mắn hơn với bước tiến về mặt chẩn đoán.
Matt Joyce

@MattJoyce sẽ stracecho bạn biết nếu một cuộc gọi hệ thống thất bại, nhưng trừ khi bạn nhìn vào nguồn, bạn không biết tòa nhà liên quan đến trạng thái thoát chương trình như thế nào (ví dụ: nếu bạn chạy vào -f, ENOENTbị chặn). Do đó không liên quan ở đây
SheetJS

1
@MattJoyce có một sự khác biệt giữa lỗi tòa nhà và chương trình báo lỗi, và câu hỏi là hỏi về trạng thái thoát chương trình.
SheetJS

1
Thật. Nhớ rằng bạn đang tìm kiếm nguồn cho rm ... thực sự không có nhiều chuyện xảy ra ở đó.
Matt Joyce

2

lấy coreutils từ git ....

nhìn vào lối ra chúng ta thấy ...

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

Bây giờ nhìn vào biến trạng thái ....

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

có vẻ như không có nhiều xảy ra ở đó với trạng thái thoát.

Tôi thấy EXIT_FAILURE và EXIT_SUCCESS chứ không phải bất cứ điều gì khác.

về cơ bản là 0 và 1 / -1

Để xem các tòa nhà thoát hiểm () cụ thể và cách chúng xảy ra trong một luồng quy trình, hãy thử điều này

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

khá đơn giản.

tham chiếu:

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


Không hiểu tại sao, +1 từ tôi. POSIX cũng chỉ thực sự nói 0 / >0.
Adrian Frühwirth

2
Mặc dù điều này có thể đúng một phần nhưng nó không trả lời câu hỏi OP I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)nên số phiếu giảm là điều dễ hiểu.
Giải thưởng

1
@ AdrianFrühwirth EXIT_FAILURE là 1: "Trên các hệ thống POSIX, giá trị của macro này là 1" ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS

Bản giới thiệu cho EXIT_FAILURE ở đó và thậm chí trang web linux cho nó cho thấy nó có thể khác trên các nền tảng khác. Vì vậy, tôi nghĩ rằng tôi cũng muốn đề xuất điều đó.
Matt Joyce

1
các thông báo lỗi bạn đang tìm kiếm nằm trong mã loại bỏ thực tế ... đối với busybox, bạn có thể vá git.busybox.net/busybox/tree/libbb/remove_file.c ... cho mỗi lần if (!(flags & FILEUTILS_FORCE)) {thêm else{printf("same error message as perror");}tôi chắc chắn các triển khai khác sẽ tương tự, nhưng nếu không phải là phiên bản busybox có thể được xây dựng riêng và bao gồm.
Technosaurus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.