Pipe
如果沒有給 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
做?
您正在尋找
-r
選項。這是一個非標準選項,可以在您的系統上實施(查看您的xargs
手冊)。來自 GNU
xargs
手冊:
-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 "$@"
測試它是否有任何參數,如果有,它會使用這些參數執行實用程序。