rm -rf โค้ดส่งคืน


9

ผู้ใดก็ตามสามารถแจ้งให้ฉันทราบถึงรหัสส่งคืนที่เป็นไปได้สำหรับคำสั่งrm -rfนอกเหนือจากศูนย์เช่นรหัสส่งคืนที่เป็นไปได้สำหรับกรณีความล้มเหลว ฉันต้องการทราบเหตุผลโดยละเอียดเพิ่มเติมสำหรับความล้มเหลวของคำสั่งซึ่งแตกต่างจากคำสั่งที่ล้มเหลว (ส่งคืนมากกว่า 0)

shell  unix 

3
@ ØHankyPankyØจริง ๆ แล้วฉันประหลาดใจที่ rm manpage ไม่ได้อธิบายรหัสสถานะการออกที่เป็นไปได้ หากคุณman lsใช้ Ubuntu มันจะอธิบายถึงสาเหตุของสถานะการออกที่ไม่ใช่ศูนย์
SheetJS

มันมีค่ามากกว่า 0 ในกรณีที่มีข้อผิดพลาด
อรุณ

6
ฉันไม่เห็นด้วยกับการย้ายข้อมูลจาก SO เนื่องจาก OP มีความสนใจในโค้ดส่งคืนจึงมีความเป็นไปได้สูงว่านี่จะเป็นปัญหาการเขียนสคริปต์ / การเขียนโปรแกรม
Adrian Frühwirth

โดยวิธีการที่ฉันสนใจจำนวนสถานการณ์มันสามารถกลับ มันจะขึ้นอยู่กับระบบปฏิบัติการ?

ค่อนข้างโกรธเกี่ยวกับการย้ายถิ่นฐานของตัวเอง ... เกือบจะได้รับความสำเร็จในการกลับรายการ = P
Matt Joyce

คำตอบ:


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
Adrian Frühwirth

อาจมีโชคที่ดีขึ้นด้วย strace ในแง่ของการวินิจฉัย
Matt Joyce

@MattJoyce straceบอกคุณถ้าเรียกระบบล้มเหลว แต่ถ้าคุณมองไปที่แหล่งที่มาที่คุณไม่ทราบวิธี syscall เกี่ยวข้องกับสถานะโปรแกรมออก (ตัวอย่างเช่นถ้าคุณทำงานใน-f, ENOENTถูกระงับ) ดังนั้นจึงไม่เกี่ยวข้องที่นี่
SheetJS

1
@MattJoyce มีความแตกต่างระหว่างความล้มเหลวของ syscall กับโปรแกรมที่รายงานข้อผิดพลาดและคำถามกำลังถามเกี่ยวกับสถานะการออกของโปรแกรม
SheetJS

1
จริง ใจที่คุณมองหาที่มาของ rm ... มีอยู่จริงไม่มากนัก
Matt Joyce

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

หากต้องการดู syscalls exit ที่เฉพาะเจาะจงและสิ่งที่เกิดขึ้นในผังกระบวนการลองทำสิ่งนี้

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

ค่อนข้างง่าย

Ref:

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


ไม่เข้าใจว่าทำไม +1 จากฉัน POSIX0 / >0ยังกล่าวเท่านั้นจริงๆ
Adrian Frühwirth

2
แม้ว่านี่อาจจะเป็นบางส่วน แต่ก็ไม่ได้ตอบคำถาม OP I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)ดังนั้นการลงคะแนนเสียงจะเข้าใจได้
Prix

1
@ AdrianFrühwirth EXIT_FAILURE คือ 1: "บนระบบ POSIX ค่าของแมโครนี้คือ 1" ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS

เอเดรียนอ้างอิงสำหรับ EXIT_FAILURE นั้นอยู่ที่นั่นและแม้แต่ลินุกซ์ manpage สำหรับมันก็บอกว่ามันอาจแตกต่างจากแพลตฟอร์มอื่น ๆ ดังนั้นฉันคิดว่าฉันอยากจะแนะนำเช่นกัน
Matt Joyce

1
ข้อความความล้มเหลวที่คุณกำลังค้นหาอยู่ในรหัสลบไฟล์จริง ... สำหรับ busybox คุณสามารถแก้ไขgit.busybox.net/busybox/tree/libbb/remove_file.c ... สำหรับการif (!(flags & FILEUTILS_FORCE)) {เพิ่มแต่ละครั้งelse{printf("same error message as perror");}ฉันมั่นใจว่าการใช้งานอื่น ๆ จะ จะคล้ายกัน แต่ถ้าไม่ใช่เวอร์ชันของ busybox อาจถูกสร้างขึ้นด้วยตัวเองและรวมไว้ด้วย
technosaurus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.