次のような単純なbusyboxshラッパーが必要です。
IF "-Q" PARAMETER IS PROVIDED THEN
acommand ALL PARAMETERS BUT "-Q" 2>&1 1>/dev/null
ELSE
acommand ALL PARAMETERS
FI
パラメータにはスペースを含めることができます。
ところで、busybox shでスクリプトを実行したいのですが、配列をサポートしていません。
busybox
のash
シェルですべてを行うことが可能です。
#!/bin/sh
for i in "${@}"
do
if [ "$i" = "-Q" ]
then
flagQ=1
else
args="$args \"$i\""
fi
done
if [ "$flagQ" = "1" ]
then
eval acommand "$args" 2>&1 1>/dev/null
else
eval acommand "$args"
fi
引数のスペースを処理する必要があるのは残念です。そうしないと、これが機能する可能性があります。
#!/bin/sh
Q=0
ARGS=
while [ $# -ge 1 ]; do
case $1 in
-Q)
Q=1
;;
*)
ARGS="$ARGS $1"
;;
esac
shift
done
if [ $Q -eq 1 ] ; then
acommand $ARGS 2>&1 1>/dev/null
else
acommand $ARGS
fi
編集:
したがって、このバージョンは、バックティックの解釈を犠牲にしてスペースを処理します。
#!/bin/busybox ash
Q=0
ARGS=
while [ $# -ge 1 ]; do
case $1 in
-Q)
Q=1
;;
*)
ARGS="$ARGS \"$1\""
;;
esac
shift
done
if [ "$Q" -eq 1 ] ; then
eval acommand $ARGS 2>&1 1>/dev/null
else
eval acommand $ARGS
fi
私はあなたがそれをCでコーディングしなければならない完全な解決策を持っていると思います、それは少し醜いでしょう。
これはbash配列を使用しますが、別の回答へのコメントから、コードはbashで実行されることは想定されていないことがわかります(bashタグが最初に質問に適用されたにもかかわらず)。これはbusyboxシェルの下で実行することを目的としています。
質問はbusyboxの制限を考えると実質的に答えられないので、私はそれが質問に答えないことをほぼ確信しています。以前は、「escape」と呼ばれるカスタムプログラムを使用して、元の引数(スペースなど)を取得するために評価できる引数文字列を作成していました。ただし、これにはシェルの外部からのサポートが必要です。
このソリューションは「bash」のみを使用します。完全に慣用的なbashコードかどうかはわかりませんが、機能します。
#!/bin/bash
i=0
Qflag=0
for arg in "$@"
do
if [ "X$arg" = "X-Q" ]
then Qflag=1
else args[$((i++))]=$arg
fi
done
if [ $Qflag = 1 ]
then exec acommand "${args[@]}" 2>&1 >/dev/null
else exec acommand "${args[@]}"
fi
最初のループは、スクリプトへの引数を使用して配列argsを構築します。ただし、リストに「-Q」を追加せず、その存在を変数Qflagに記録します。
最後のifステートメントは、Qflagが1に設定されているかどうかを示し、設定されている場合は、エラーを「acommand」から標準出力に送信し、通常の標準出力を/ dev / nullに送信します(これは、I /Oの場合の効果とは異なります)。リダイレクトが逆になります。これにより、標準出力が/ dev / nullに送信され、標準エラーが同じ場所に送信され、「acommand」で無音になります)。
'exec'の使用は、この場合の終了ステータス処理を単純化する簡単な最適化です。
引数を別々の行に出力する「acommand」でテストしました。
#!/bin/sh
for arg in "$@"
do echo "$arg"
done
次のようなコマンドラインを使用します。
bash wrapper.sh -c -d 'arg with spaces'
これは出力を生成します:
-c
-d
arg with spaces
明らかに、I / Oリダイレクトが設定されていると、以下からの出力はありません。
bash wrapper.sh -c -Q -d 'arg with spaces'
ただし、I / Oリダイレクトを省略すると、同じ出力が表示されます。