跳至主要內容
技術

Linux 常用的 sudo 指令到底是什麼縮寫?

Linux 常用的 sudo 指令到底是什麼縮寫?

sudo 這個指令很常用,不知道你有沒有好奇過:它到底是哪幾個英文字的縮寫?

sudo 是 su 加上 do,這點大家沒有爭議。所以「sudo 是什麼縮寫」這個問題,其實是在問 su 是什麼。網路上的答案主要分兩派:

  • superuser do:以超級使用者身分做事
  • substitute user do:換成另一個使用者做事

英文維基百科兩個都收了,說 sudo 原本是 superuser do,現代意思則是 substitute user do。兩派都講得很有把握,我就直接去翻一手資料:Unix 原始手冊、1985 年貼在 Usenet 上的 sudo 原始碼、sudo 官方的 git 歷史,還有 sudo 官網二十幾年來的存檔。

先講結論

  • sudo 的原意是 superuser do。1985 年的原始碼和 2014 年創作者本人的訪談都對得上。
  • 1996 到 2007 年,sudo 官方 FAQ 和首頁都寫 superuser do。2007 年改成 su “do”,一直用到現在。
  • substitute user do 在 sudo 的 git 歷史和官網快照裡都找不到。這是後人用 su 的現代定義推出來的說法。
  • su 自己也換過說法:1971 年的手冊寫「變成 super-user」,1979 年的 V7 才出現「substitute user」。

下面照時間順序一站一站講。

1971 年:su 只會做一件事

Unix 第一版手冊(1971 年 11 月 3 日)裡,su 的 NAME 行是這樣寫的:

su — become privileged user

手冊目錄頁寫得更直接:su ... become super-user。

用法也很陽春:su password,密碼直接當參數打在指令後面。說明文字是這樣開頭的:

su allows one to become the super-user, who has all sorts of marvelous powers.

意思是 su 讓你變成超級使用者,擁有各種神奇的力量。到了 1973 年的第三版,這句多了一個括號:「marvelous (and correspondingly dangerous) powers」,神奇的力量後面補上「相對也很危險」。兩年之內就有人覺得該加這句警告。

1975 年第六版的 su.c,第一行註解是:

/* su -- become super-user */

整支程式的核心就是 setuid(0),沒有參數可以指定要變成誰。從第一版到第六版,su 都只能變成 root,把它讀成 super-user 完全合理。

要注意的是,這幾版手冊都只描述 su 做什麼,沒有任何一版寫過「su 是 xxx 的縮寫」。super-user 這個讀法來自目錄頁和原始碼註解,不是官方定義。

1979 年:su 換了一個說法

1977 年的 PWB/UNIX 已經讓 su 接受一個 [ name ] 參數,可以切成任何使用者,但 NAME 行還是「become privileged user」。功能先改了,名字的說明還沒跟上。

1979 年 1 月的 Unix 第七版(V7),NAME 行改成:

su - substitute user id temporarily

用法變成 su [ userid ],不指定使用者就預設 root。之後的 3BSD、4.1BSD 到 4.3BSD 都沿用這句。現在 Linux 上 util-linux 的 man page 寫的是「run a command with substitute user and group ID」,也是同一個脈絡。

所以 substitute user 這個讀法也有一手出處,出自 V7 的 NAME 行。

1980 年代初:sudo 誕生,作者心裡的 su 還是 super user

sudo 官網的歷史頁說,sudo 是 Bob Coggeshall 和 Cliff Spencer 在紐約州立大學水牛城分校(SUNY/Buffalo)資工系寫的,跑在一台裝 4.1BSD 的 VAX-11/750 上。

年份有好幾種說法:官網現在寫「around 1980」;官方歷史文件在 2003 年曾有一版寫 Cliff Spencer 在 1983 年寫出第一版;Coggeshall 在 2014 年的訪談裡則說,1981 年左右他剛從水牛城分校畢業。保險的講法是 1980 年代初。

這裡有個小諷刺:4.1BSD 上 su 的 man page 早就寫著 substitute user id temporarily,但 sudo 的作者還是把 su 讀成 super user。證據是 1985 年 12 月貼在 Usenet net.sources 新聞群組上的 sudo 原始碼,前後有兩份。

第一份是 Cliff Spencer 在 1985 年 12 月 9 日貼的。那幾天群組裡有好幾個人在交流同一類小工具(asroot、enable),都是讓指定的使用者用 root 身分跑指令。他回文的開頭是一句「Okay I’ll bite」(好吧,我也來湊一腳),接著貼出自己的 sudo,說它會試著管住誰能用它。man page 的 NAME 行是:

sudo \- do a super thing

原始碼註解寫的是:

* sudo - run a command as su.

五天後,水牛城的 Don Gworek 貼出另一份,作者欄列了五個人。NAME 行寫得比較正經:

sudo \- do a command as the superuser

兩份都寫死 setuid(0),只能變成 root。水牛城那份的 man page 裡,連 sudoers 檔的說明都是「list of superusers」,超級使用者名單。

那幾天還有人貼出另一支 force,也有人回文潑冷水:這類工具不就跟 su -f root -c 一樣嗎?何必重新發明輪子。四十年後,幾乎每台 Linux 機器上都裝著 sudo。

取名的人怎麼說

2014 年 Hackaday 訪問了 Bob Coggeshall,影片大約 4 分 05 秒開始講取名的經過。他說 sudo 要取代的指令是 su,而 Unix 的哲學是指令越短越好:兩個字母很好,三個還可以,四個就不行。所以他在 su 後面加上 do,意思是:

do a super user thing

他還說,這句就是當時 man page 的標題,正好和 1985 年那份「do a super thing」對上。(上面的引述是對照 YouTube 自動字幕整理的,關鍵句「do a super user thing」在字幕裡很清楚。)

1996 到 1999 年:sudo 學會變成別人,名字的說明卻沒跟上

1996 年 4 月 28 日,外部貢獻者 Keith Garry Boyce 的 patch 被合進 sudo,加上 -u 選項,從此可以用 root 以外的身分執行指令(commit da33d14c)。官方封存裡最早能下載到、帶 -u 的版本是 1996 年 8 月的 cu-sudo 1.5。

但 man page 的 NAME 行沒有跟著改,一直寫到 1999 年:

sudo - execute a command as the superuser

直到 1999 年 8 月 1 日的 commit 29974bceb,commit 訊息寫著「Update to reality」,才改成現在的樣子:

-sudo - execute a command as the superuser
+sudo - execute a command as another user

功能在 1996 年就變了,說明晚了三年才追上「現實」。

同一時期,sudo 官方對名字的說法很明確。1996 年 8 月的 FAQ(commit 6ec8aba27)有一題:

Q) How do you pronounce `sudo'?
A) soo-doo (for superuser do).

Wayback Machine 裡最早的官網首頁存檔是 1998 年的,第一句就是「Sudo (superuser do) allows a system administrator to…」。

2007 年:官方把答案改成 su “do”

Wayback Machine 的快照顯示,官網首頁到 2007 年 3 月 29 日都還寫著 superuser do。到了 2007 年 5 月 16 日,變成:

Sudo (su “do”) allows a system administrator to…

同年 6 月 9 日,FAQ 那題也改了(commit 7323cbb50):

The official pronunciation is soo-doo (for su “do”). However, an alternate pronunciation, a homophone of “pseudo”, is also common.

這兩段到今天還在 sudo.ws 的介紹頁和 troubleshooting 頁上。

為什麼要改?這次 commit 的訊息只寫「Mention alternate sudo pronunciation」,也就是補充另一種唸法,完全沒提為什麼 superuser 不見了。sudo 兩個郵件列表的封存我也找過,沒有相關討論。所以改寫的動機沒有一手資料可查。

我自己的解讀(純屬推測):1996 年以後 sudo 已經可以變成任何人,繼續寫 superuser do 就不精確了。改成 su “do” 之後,官方不用替 su 下定義,讀成 super user 或 substitute user 都說得通。

那 substitute user do 是從哪來的?

我在 sudo 的完整 git 歷史(從 1993 年一路到 2026 年)裡搜「substitute user」,只找到兩筆 2002 年的程式碼,講的是提示字串裡 %u、%h 要「替換成使用者名稱、主機名稱」,跟 sudo 這個名字無關。官網歷年快照裡也沒有。

維基百科「substitute user, do」這個說法引用的是 ArchWiki 和一本 Linux 考照書。它的推論是:現代 su 的定義是 substitute user,sudo 又能以任何使用者身分執行,所以 sudo 等於 substitute user do。

這個推論本身說得通,用來記功能也很好記,但它是後人推出來的,不是 sudo 作者或官方講的話。

所以該怎麼唸?

官方唸法是 soo-doo,後半跟英文的 do 同音。官方 FAQ 也承認,唸成跟 pseudo 同音(後半是 doh)也很常見。

Coggeshall 在訪談裡被問到會不會介意別人唸成 pseudo,他說完全不會,他自己唸 soo-doo,但大家愛怎麼唸就怎麼唸。

整理成一條時間線

flowchart TB
    A["1971 Unix V1<br/>su:become privileged user<br/>只能變成 super-user"] --> B["1977 PWB/UNIX<br/>su 可以指定使用者<br/>名字的說明沒改"]
    B --> C["1979 Unix V7<br/>su:substitute user id temporarily"]
    C --> D["1980 年代初 SUNY/Buffalo<br/>寫出 sudo,只能變成 root"]
    D --> E["1985 貼上 Usenet<br/>sudo:do a super thing"]
    E --> F["1996 sudo 加入 -u 選項<br/>FAQ:soo-doo (for superuser do)"]
    F --> G["1999 man page<br/>改成 as another user"]
    G --> H["2007 官方說法<br/>改成 su #quot;do#quot;"]

一句話回答標題的問題:sudo 是 su 加上 do。創作者心中的 su 是 super user,所以原意是 superuser do;官方現在只寫 su “do”,su 要讀成哪個字,留給你自己決定。

想自己驗證的話

這篇的關鍵證據都可以用一兩行指令重現:

# Unix V7(1979)su 的 NAME 行
curl -s https://raw.githubusercontent.com/dspinellis/unix-history-repo/Research-V7/usr/man/man1/su.1 | sed -n 1,3p

# Unix V6(1975)su.c 的第一行註解
curl -s https://raw.githubusercontent.com/dspinellis/unix-history-repo/Research-V6/usr/source/s2/su.c | head -1

# sudo 的 man page 在 1999 年從 superuser 改成 another user(完整歷史,clone 要等一下)
git clone https://github.com/sudo-project/sudo && cd sudo
git show 29974bceb -- sudo.pod | grep -A3 NAME

# 官方 FAQ 的唸法說明:1996 年版 vs 2007 年版
git show 6ec8aba27:TROUBLESHOOTING | grep -A1 pronounce
git show 7323cbb50 -- TROUBLESHOOTING | grep '^+A)'

參考資料

留言討論

esc
輸入關鍵字搜尋文章...
查看收藏 →