Hostname
為什麼主機名 -h 返回 255
“沒有消息就是好消息”,按照正常約定應該返回 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)那樣提出問題的人。