如果未向 xargs 提供任何輸入,則不要讓 xargs 運行該實用程式

如果未向 xargs 提供任何輸入,則不要讓 xargs 運行該實用程式

我有這個指令:

docker volume ls -qf dangling=true | xargs docker volume rm

我明白了:

"docker volume rm" requires at least 1 argument.
See 'docker volume rm --help'.

Usage:  docker volume rm [OPTIONS] VOLUME [VOLUME...]

我認為這是因為沒有輸入xargs(因為命令沒有返回匹配的捲docker)。我該怎麼xargs沒有什麼當它沒有收到輸入時?

答案1

您正在尋找該-r選項。這是一個非標準選項,可能會在您的系統上實現(請檢查您的xargs手冊)。

來自 GNUxargs手冊:

-r,--no-run-if-empty

如果標準輸入不包含任何非空白,則不要執行該命令。通常,即使沒有輸入,該命令也會運行一次。該選項是 GNU 擴充。

來自 OpenBSD 系統的手冊:

-r

如果沒有參數,請勿執行該指令。通常,即使沒有參數,該命令也至少執行一次。

在 FreeBSD 和 macOS 上,這是預設行為。 FreeBSD 可以-r選擇與 GNU 相容xargs,而 macOS 則沒有。

xargs在 AIX 和 Solaris 上沒有-r選項,並且不知道 AIX 上的預設行為是什麼(我無權存取 AIX 系統)。預設情況下,Solaris 將至少運行該實用程式一次。


-r在沒有標誌的系統上xargs(並且在東部運行該實用程式一次是預設行為,如在 Solaris 上),一種可移植的解決方法是使用

something | xargs sh -c '[ "$#" -gt 0 ] && utility "$@"' sh

(或類似的東西;請注意,尾隨sh是必需的) whereutility是您想要運行的實用程序xargs,以及 wheresomething生成一些參數。

簡短的 shell 腳本[ "$#" -gt 0 ] && utility "$@"測試是否為其提供了任何參數,如果是,則它使用這些參數來執行該實用程式。

相關內容