rm -rf mengembalikan kode

9

Siapa pun dapat memberi tahu saya kode kemungkinan kembali untuk perintah rm -rf selain nol yaitu, kode kembali yang mungkin untuk kasus kegagalan. Saya ingin tahu alasan lebih rinci untuk kegagalan perintah tidak seperti hanya perintah gagal (kembali selain 0).


sumber
3
@ ØHankyPankyØ Saya benar-benar terkejut bahwa rm manpage tidak menjelaskan kemungkinan kode status keluar. Jika Anda man lsmenggunakan Ubuntu, ini menjelaskan alasan untuk status keluar yang tidak nol
SheetJS
Nilainya lebih besar dari 0. Dalam hal terjadi kesalahan.
Arun
6
Saya tidak setuju dengan migrasi dari SO, karena OP tertarik pada kode kembali, sangat mungkin bahwa ini adalah jenis masalah scripting / pemrograman.
Adrian Frühwirth
ngomong-ngomong, saya tertarik pada jumlah skenario yang dapat dikembalikan. Apakah ini tergantung OS?
agak kesal tentang migrasi sendiri ... hampir mendapat pencapaian pembalikan = P
Matt Joyce

Jawaban:

8

Untuk melihat kode kembali, Anda dapat menggunakan echo $?dalam bash.

Untuk melihat makna sebenarnya, beberapa platform (seperti Debian Linux) memiliki perrorbiner, yang dapat digunakan sebagai berikut:

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

rm -rfsecara otomatis menekan sebagian besar kesalahan. Kesalahan yang paling mungkin Anda akan lihat adalah 1(Operasi tidak diizinkan), yang akan terjadi jika Anda tidak memiliki izin untuk menghapus file. -fsengaja menekan sebagian besar kesalahan

SheetJS
sumber
3
+1 untuk disebutkan perror. Pada sistem saya ini dikirimkan dengan mysql.
Adrian Frühwirth
mungkin lebih beruntung dengan strace dalam hal diagnostik.
Matt Joyce
@MattJoyce stracememberi tahu Anda jika panggilan sistem gagal, tetapi kecuali jika Anda melihat sumbernya Anda tidak tahu bagaimana syscall berhubungan dengan status keluar program (misalnya, jika Anda menjalankan -f, ENOENTditekan). Karenanya itu tidak relevan di sini
SheetJS
1
@MattJoyce ada perbedaan antara gagal syscall dan program melaporkan kesalahan, dan pertanyaannya adalah bertanya tentang status keluar program.
SheetJS
1
Benar. Pikiran Anda melihat sumber untuk rm ... benar-benar tidak banyak yang terjadi di sana.
Matt Joyce
2

meraih coreutils dari git ....

melihat keluar kita melihat ...

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

Sekarang melihat variabel status ....

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

Sepertinya tidak banyak yang terjadi di sana dengan status keluar.

Saya melihat EXIT_FAILURE dan EXIT_SUCCESS dan bukan yang lain.

jadi pada dasarnya 0 dan 1 / -1

Untuk melihat keluar spesifik () syscalls dan bagaimana mereka terjadi dalam aliran proses coba ini

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

cukup sederhana.

ref:

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

Matt Joyce
sumber
Tidak mengerti mengapa, +1 dari saya. POSIX juga hanya benar-benar mengatakan 0 / >0.
Adrian Frühwirth
2
Meskipun ini mungkin sebagian benar, itu tidak menjawab pertanyaan OP I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)sehingga suara turun bisa dimengerti.
Prix
1
@ AdrianFrühwirth EXIT_FAILURE adalah 1: "Pada sistem POSIX, nilai makro ini adalah 1" ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS
Adrian ref untuk EXIT_FAILURE ada di sana dan bahkan manual linux untuk itu menyarankan itu bisa berbeda pada platform lain. jadi saya pikir saya akan menyarankan itu juga.
Matt Joyce
1
pesan kegagalan yang Anda cari ada dalam kode hapus file yang sebenarnya ... untuk busybox Anda dapat menambal git.busybox.net/busybox/tree/libbb/remove_file.c ... untuk setiap if (!(flags & FILEUTILS_FORCE)) {penambahan, else{printf("same error message as perror");}saya yakin implementasi lain akan menjadi serupa, tetapi jika tidak versi busybox dapat dibangun sendiri dan disertakan.
technosaurus