shell 的 watch 指令無法辨識檔名

shell 的 watch 指令無法辨識檔名

在嘗試時watch bash -c 'du -h /etc/passwd && df -h',文件的路徑似乎被完全忽略,而是du -h透過當前工作目錄運行。當我運行時觀察到相同的結果watch bash -c 'stat /etc/passwd && df -h',並stat返回stat: missing operand錯誤。相比之下,使用watch -e "command /path/to/file"orwatch "command /path/to/file"則沒有問題。

那為什麼不起作用watch bash -c 'du -h /etc/passwd && df -h'呢?是watch爭論的問題還是bash爭論分裂的問題?

答案1

watch透過將參數傳遞給 來執行帶參數的命令sh -c,所以最終運行的是:

sh -c 'bash -c du -h /etc/passwd && df -h'

您正在執行的 shell 會刪除您套用的第一層引號。然後-h, ,/etc/passwd作為$0和傳遞$1給 bash,因此它們實際上被忽略。運行類似的東西:

watch 'du -h /etc/passwd && df -h'
watch "bash -c 'du -h /etc/passwd && df -h'"

要驗證,請使用strace

strace -fe execve -o log watch bash -c 'du -h /etc/passwd && df -h'

log包含:

17132 execve("/usr/bin/watch", ["watch", "bash", "-c", "du -h /etc/passwd && df -h"], [/* 40 vars */]) = 0
17134 execve("/bin/sh", ["sh", "-c", "bash -c du -h /etc/passwd && df "...], [/* 42 vars */]) = 0
17135 execve("/bin/bash", ["bash", "-c", "du", "-h", "/etc/passwd"], [/* 42 vars */]) = 0
17135 execve("/usr/bin/du", ["du"], [/* 42 vars */]) = 0
17135 +++ exited with 0 +++

相關內容