Hostname

為什麼主機名 -h 返回 255

  • April 6, 2019

“沒有消息就是好消息”,按照正常約定應該返回 0。為什麼

hostname -h 

返回 255,尤其是當 255 按照慣例表示“退出狀態超出範圍”時

"hostname -h"

在我的 RHEL 機器上不返回 255。

它確實返回錯誤 4,這是有道理的

hostname -h
Usage: hostname [-v] {hostname|-F file}      set hostname (from file)
........
echo $?
4

如果您從 net-utils 查看 hostname.c,您會清楚地看到:

static void usage(void)
{
   fprintf(stderr, _("Usage: hostname [-v] {hostname|-F file}      set hostname (from file)\n"));
........
 exit(4); /* E_USAGE */
}

並在同一個文件中引用usage():

........
   case '?':
   case 'h':
   default:
       usage();

   };

所以我不太確定為什麼你會得到 255,在 MAC 版本上你可能會得到“1”,但我從未見過“255”。

編輯你是對的,我剛剛查看了fedora19,主機名來自主機名RPM,實際上它們確實返回255:

void
usage(FILE *stream)
{
       fprintf(stream,
.....
exit(-1);
}

;

所以在這裡我將嘗試解釋你的困惑。

好吧,首先執行 exit(-1) 是程序員犯了一個錯誤,至少對於 POSIX 環境是這樣,因為在這樣的作業系統中,退出狀態不是 0 的任何東西都被認為是 FAILURE,但是:

標準 C 庫中的 exit() 函式呢?

它的手冊頁告訴我們“exit() 函式會導致正常的程序終止,並將 status & 0377 的值返回給父程序”。

現在,狀態和 0377?

這意味著什麼?

嗯,0377 是八進制的 377,十進制是 255,或者十六進制是 0xFF。

#include <stdlib.h>
void exit(int status);

因此,如果 exit 接受一個帶符號的參數,但返回一個 0xFF 遮罩到其父級(即 shell),並且“-1”表示為二進制補碼中的所有 1,這僅表示 shell 將要返回的值看到,因此,$?將儲存 = 0xff 0xff 是 255 的回憶,差不多就是這樣。

即使程序員知道當他呼叫 exit(-1) 時所有使用者都會得到 255,但在 POSIX 環境中程式時這樣做是一個不好的習慣。程式碼最終會到達會誤解 -1(255) 參數的含義並像你(OP)那樣提出問題的人。

引用自:https://unix.stackexchange.com/questions/114817