動態地將標誌傳遞給 xargs

動態地將標誌傳遞給 xargs

我有這個:

r_flag=' -r ';

docker ps -aq  | xargs "$r_flag" docker rm -v | cat;

我在 ubuntu 上收到此錯誤:

xargs: -r : No such file or directory

這是為什麼?我只是想將 -r 選項傳遞給 xargs。如果我將其更改為:

r_flag=' -r ';

r_flag='-r';

瘸...!但為什麼。

答案1

r_flag=" -r "變數值中包含空格。換句話說,參數"$r_flag"toxargs不以 a 開頭-,因此不被視為選項。選項的第一個字符成為破折號。

由於它不是一個選項,因此xargs將其解釋為應運行的實用程式的名稱。它無法找到實用程式並抱怨。

做正確事的替代方法:

set -- -r
docker ps -aq | xargs "$@" docker rm -v

或者,在 中使用數組bash

xargs_opts=( -r )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v

這將使傳遞附加標誌變得容易,而xargs無需定義新變數:

set -- -r -t
docker ps -aq | xargs "$@" docker rm -v

或者,在 中使用數組bash

xargs_opts=( -r -t )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v

傳遞給命令的陣列顯然可以動態建構:

xargs_opts=()

if should_trace; then
    xargs_opts+=( -t )
fi
if should_not_run_on_empty; then
    xargs_opts+=( -r )
fi

相關內容