2

次のような単純なbusyboxshラッパーが必要です。

IF "-Q" PARAMETER IS PROVIDED THEN  
    acommand ALL PARAMETERS BUT "-Q" 2>&1 1>/dev/null  
ELSE  
    acommand ALL PARAMETERS  
FI

パラメータにはスペースを含めることができます。

ところで、busybox shでスクリプトを実行したいのですが、配列をサポートしていません。

4

3 に答える 3

2

busyboxashシェルですべてを行うことが可能です。

#!/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
于 2009-10-20T14:23:50.837 に答える
0

引数のスペースを処理する必要があるのは残念です。そうしないと、これが機能する可能性があります。

#!/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でコーディングしなければならない完全な解決策を持っていると思います、それは少し醜いでしょう。

于 2009-10-20T12:35:34.677 に答える
0

これは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リダイレクトを省略すると、同じ出力が表示されます。

于 2009-10-20T13:18:32.320 に答える