watch 指令:用法與 -n 間隔、-d 標示、輸出改變時結束

測試環境RHEL 系列AlmaLinux 9.8procps-ng 3.3.17root 帳號Debian 12 · procps-ng 4.0.2 一般帳號
程序 · 工作排程指令watch位置/usr/bin/watch2026-11-05 確認
確認指令輸出變化的指令

watch 指令是每 2 秒重新執行指定的指令,並把輸出重新畫滿整個終端機畫面的 Linux 指令。在 AlmaLinux 9 伺服器上一邊從另一個視窗修改檔案、一邊用 watch 監看,結果 -d 選項標示出改變的字元,-g 選項則在輸出改變後結束 watch。

以下輸出是在 AlmaLinux 9.8 伺服器(root 帳號)的工作資料夾中執行的結果,Debian 12 伺服器只確認了版本。畫面最上方標頭列的主機名稱已換成範例值 server1,時間以 UTC 輸出。

1️⃣ watch 指令用法

  • ↪️ 預設 2 秒間隔與用 Ctrl+C 結束

在 watch 後面寫上要重複執行的指令,沒有選項時會每 2 秒執行一次,並把畫面換成新的輸出。監看 date 時,畫面最上方出現標頭列,空一行後接著是 date 的輸出。

watch date
Every 2.0s: date                                                   server1: Thu Oct 29 02:28:07 2026

Thu Oct 29 02:28:07 UTC 2026

標頭列左邊是更新間隔與正在執行的指令,右邊是主機名稱與最後一次執行的時間。2 秒後再看同一個畫面,標頭列的時間和 date 的輸出都一起變了。

Every 2.0s: date                                                   server1: Thu Oct 29 02:28:09 2026

Thu Oct 29 02:28:09 UTC 2026

watch 會一直執行到你自己結束為止,所以用 Ctrl+C 結束。按下 Ctrl+C 後 watch 畫面消失,提示字元回來了。接著確認的結束碼是 0。

echo $?
0

watch 用在重複執行只輸出一次就結束的指令。想看各程序的 CPU 與記憶體使用量如何變化,會自己重繪畫面的 top 指令比較合適。

watch 是 procps-ng 套件裡的指令。版本用 [watch -v] 確認,AlmaLinux 9.8 伺服器是 3.3.17,Debian 12 伺服器是 4.0.2。

watch -v
watch from procps-ng 3.3.17
watch -v
watch from procps-ng 4.0.2

2️⃣ watch 間隔與標示選項

  • ↪️ -n 間隔、-d 標示、-t 關閉標頭列

在 -n 後面寫秒數就會改變更新間隔。用 [watch -n 1 date] 執行後,標頭列左邊變成 Every 1.0s。

watch -n 1 date
Every 1.0s: date                                                   server1: Thu Oct 29 02:28:15 2026

Thu Oct 29 02:28:15 UTC 2026

依 man 頁面,間隔不能設得比 0.1 秒更短,比這更小的值會改成 0.1 秒。小數點用句點或逗號都能辨識。

-d 會標示與上一次更新不同的字元。用 [ls -l] 監看工作資料夾裡的 size.log 時,從另一個視窗在這個檔案加了一行。

watch -d -n 1 ls -l size.log
Every 1.0s: ls -l size.log                                         server1: Thu Oct 29 02:28:53 2026

-rw-r--r-- 1 root root 7 Oct 29 02:28 size.log
printf 'line 2\n' >> size.log

檔案大小從 7 變成 14 時,從大小欄到行尾都被標示出來。因為數字多了一位,後面的字元全都往後移了一格。下一次更新時值沒有變,標示就消失了。

Every 1.0s: ls -l size.log                                         server1: Thu Oct 29 02:28:54 2026

-rw-r--r-- 1 root root 14 Oct 29 02:28 size.log

若要持續標示與第一次執行相比改變過的地方,請使用 [--differences=permanent](依 man 頁面)。

-t 會拿掉標頭列和下面的空行,只留下指令的輸出。

watch -t -n 1 date
Thu Oct 29 02:28:19 UTC 2026

3️⃣ watch 指令結束條件與選項

  • ↪️ -g 輸出改變與 -e 錯誤

-g 會在指令輸出改變時結束 watch。用在等狀態檔的內容改變後,再進行下一個工作。

watch -g -n 1 cat status.txt
Every 1.0s: cat status.txt                                         server1: Thu Oct 29 02:29:12 2026

running

從另一個視窗用下面的指令把 status.txt 的內容改成 done。

printf 'done\n' > status.txt

於是 watch 結束、提示字元回來,結束碼是 0。

echo $?
0

-e 會在指令以非 0 的結束碼結束時停止更新畫面。用 ls 監看工作資料夾裡不存在的檔案,畫面除了 ls 的錯誤輸出,最下面一行還出現按任意鍵就會結束的提示。

watch -e -n 1 ls nofile.txt
Every 1.0s: ls nofile.txt                                          server1: Thu Oct 29 02:29:18 2026

ls: cannot access 'nofile.txt': No such file or directory










command exit with a non-zero status, press a key to exit

標頭列的時間停在剛執行完的時刻,按一個鍵後 watch 就結束了。這次的結束碼是 8。

echo $?
8

man 頁面把結束碼 8 說明為包含指令因錯誤而結束之情況的值。

📌 主要選項:本文實際執行的結果

選項作用本文看到的結果
-n 秒改變更新間隔(預設 2 秒)標頭列變成 Every 1.0s
-d標示與上一次更新不同的字元檔案大小 7 → 14 時從該欄標示到行尾,下一次更新時消失
-t關閉標頭列和下面的空行只剩一行 date 輸出
-g輸出改變時結束 watchrunning → done 後結束,結束碼 0
-e指令因錯誤結束時停住畫面按鍵後結束,結束碼 8
-v輸出版本資訊AlmaLinux 9.8 伺服器是 watch from procps-ng 3.3.17,Debian 12 伺服器是 watch from procps-ng 4.0.2

📎 其他選項:依官方手冊

選項作用
-b指令以非 0 的結束碼結束時發出嗶聲
-c解讀 ANSI 顏色與字型樣式碼,保留指令輸出的顏色
-p配合每個間隔執行,讓更新時間不會往後延
-x用 exec 代替 sh -c 執行指令,可以少用引號
-w長行不換到下一行,直接截斷輸出
--differences=permanent持續標示第一次執行後所有改變過的地方
-h輸出說明

4️⃣ watch 指令的引號與管線

  • ↪️ 用單引號括起來與監看磁碟使用量

watch 會用 sh -c 執行收到的指令,所以含有 管線(|) 或 $ 的指令,要把整個指令用單引號括起來。用 [ls | wc -l] 監看工作資料夾的檔案數時,標頭列連同管線顯示了整個指令。

watch -n 1 'ls | wc -l'
Every 1.0s: ls | wc -l                                             server1: Thu Oct 29 02:30:22 2026

6

從另一個視窗再建立一個檔案後,下一次更新時數字從 6 變成 7。

printf 'c\n' > q3.txt
Every 1.0s: ls | wc -l                                             server1: Thu Oct 29 02:30:24 2026

7

不加引號輸入 [watch -n 1 ls | wc -l] 時,shell 會先拆開管線,watch 的整個畫面輸出都會交給 wc。所以要監看的指令有管線時,要把整個指令用引號括起來。

$ 也遵守同樣的規則。不加引號執行 [watch -n 1 echo $$] 時,目前的 shell 先把 $$ 換成數字,標頭列的指令也顯示了那個數字。

watch -n 1 echo $$
Every 1.0s: echo 3755802                                           server1: Thu Oct 29 02:29:37 2026

3755802

用單引號括起來後 $$ 會原樣傳過去,所以標頭列顯示 echo $$,每次更新都會輸出新執行的 sh 的 PID。

watch -n 1 'echo $$'
Every 1.0s: echo $$                                                server1: Thu Oct 29 02:29:40 2026

3756270
Every 1.0s: echo $$                                                server1: Thu Oct 29 02:29:41 2026

3756333

用 [echo $$] 確認目前 shell 的 PID,和不加引號執行時固定住的數字相同。

echo $$
3755802

像磁碟使用量這種變化緩慢的值,把間隔設成幾秒來監看。 du 指令的 -s 只輸出合計,-h 以 K、M 這類單位輸出。用 [du -sh .] 監看工作資料夾時,從另一個視窗在記錄檔加了 8,001 位元組,下一次更新時 28K 變成 36K。

watch -n 2 du -sh .
Every 2.0s: du -sh .                                               server1: Thu Oct 29 02:30:34 2026

28K     .
printf '000d\n' 0 >> grow.log
Every 2.0s: du -sh .                                               server1: Thu Oct 29 02:30:36 2026

36K     .

🔲 watch 指令模擬器

在下面的模擬器執行 watch 後,可以用 [🖊 另一個視窗] 標籤修改檔案,親自確認畫面如何變化。

watch 指令模擬器procps-ng 3.3.17
[root@server work]#
只在瀏覽器內運作。在 watch 畫面中用「另一個視窗」標籤修改檔案,再用 Ctrl+C 結束。

🔢 FAQ & 推薦內容

依 man 頁面,在環境變數 WATCH_INTERVAL 放入秒數後,沒有寫 -n 時就會用這個值當作間隔。這個值的規則和 -n 相同,不能設得比 0.1 秒更短。

依 man 頁面,watch 會先刪掉輸出中的控制字元再繪製。監看會輸出顏色的指令時,若要連顏色一起看,請像 [watch -c] 一樣加上 -c。

依 man 頁面,預設執行時每次更新,時間的秒以下部分都會一點一點增加。加上 -p 就會配合每個間隔執行,那部分幾乎維持相同的值。

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 10   +   4   =