rm -rf戻りコード


9

ゼロ以外のコマンドrm -rfの考えられる戻りコード、つまり、失敗した場合の考えられる戻りコードを誰にでも知らせることができます。コマンドが失敗しただけではなく(0以外のリターン)、コマンドの失敗の詳細な理由を知りたい。

shell  unix 

3
@ØHankyPankyØ実際にrmマンページに考えられる終了ステータスコードが記述されていないことに驚いています。man lsUbuntuの場合、ゼロ以外の終了ステータスの理由が説明されています
SheetJS

0より大きい値。エラーの場合。
アルン2013

6
OPはリターンコードに関心があるため、SOからの移行に同意しません。これは、スクリプト/プログラミングの種類の問題である可能性が非常に高いです。
エイドリアンFrühwirth2013

ちなみに、私はそれが返すことができるシナリオの数に興味があります。OSに依存しますか?

私自身、移行について少し腹を立てています...ほぼ逆転の成果を得ました= 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が付属しています。
エイドリアンFrühwirth2013

診断に関しては、straceの方がうまくいくかもしれません。
Matt Joyce

@MattJoyce straceは、システムコールが失敗したかどうかを通知しますが、ソースを調べないと、syscallがプログラムの終了ステータスにどのように関連しているかがわかりません(たとえば、で実行した場合-fENOENT抑制されます)。したがって、ここでは関係ありません
SheetJS

1
@MattJoyce syscallの失敗とプログラムがエラーを報告するのには違いがあり、質問はプログラムの終了ステータスについて尋ねています。
SheetJS 2013

1
そうだね。rmのソースを確認してください。実際、それほど多くのことは行われていません。
Matt Joyce

2

gitから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

特定のexit()システムコールと、それらがプロセスフローでどのように発生するかを確認するには、これを試してください。

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

かなりシンプル。

ref:

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


理由がわからない、+ 1してください。POSIXも本当に言うだけ0 / >0です。
エイドリアンFrühwirth2013

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ühwirthEXIT_FAILUREは1: "POSIXシステムでは、このマクロの値が1である"(gnu.org/software/libc/manual/html_node/Exit-Status.html
SheetJS

エイドリアンは、EXIT_FAILUREのリファレンスがあり、Linuxのマンページでさえ、他のプラットフォームでは異なる可能性があることを示唆しています。だから私もそれを提案すると思いました。
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バージョンを独自に構築して含めることができます。
テクノサウルス2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.