Pipe

如果沒有給 xargs 輸入,不要讓 xargs 執行該實用程序

  • February 10, 2021

我有這個命令:

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做?

您正在尋找-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是必需的)utility您要執行的實用程序在xargs哪裡,以及在哪裡something產生一些參數。

簡短的 shell 腳本[ "$#" -gt 0 ] && utility "$@"測試它是否有任何參數,如果有,它會使用這些參數執行實用程序。

引用自:https://unix.stackexchange.com/questions/521595