busybox sh wrapper添加额外的功能

时间:2009-10-20 12:07:23

标签: linux shell busybox

我需要一个简单的busybox sh包装器,它将执行:

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

参数可以包含空格。

BTW我想用busybox sh运行脚本,它不支持数组。

3 个答案:

答案 0 :(得分:2)

可以在busybox的{​​{1}} shell中完成所有操作:

ash

答案 1 :(得分: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编写它,这将有点难看。

答案 2 :(得分:0)

这使用bash arrays - 但我从评论中看到另一个答案,该代码不应该在bash下运行(尽管bash标签最初应用于该问题);它意味着在busybox shell下运行。

我几乎可以肯定它没有回答这个问题,因为考虑到busybox的限制,这个问题基本上无法解决。在过去,我使用了一个名为'escape'的自定义程序来构建一个参数字符串,可以通过eval来获取原始参数 - 空格和所有。但这需要来自shell之外的支持。


此解决方案仅使用'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重定向,则会看到相同的输出。

相关问题