busybox sh 包装器添加额外的功能

发布于 2024-08-08 12:30:41 字数 265 浏览 4 评论 0原文

我需要一个简单的 busybox sh 包装器,它可以:

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

参数可能包含空格。

顺便说一句,我想用 busybox sh 运行脚本,但它不支持数组。

I need a simple busybox sh wrapper which will do:

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

Parameters may include spaces.

BTW I want to run the script with busybox sh and it doesn't support arrays.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

旧情别恋 2024-08-15 12:30:41

可以在 busyboxash shell 中完成这一切:

#!/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

It's possible to do it all in busybox's ash shell:

#!/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
请帮我爱他 2024-08-15 12:30:41

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

我几乎可以肯定它不会回答这个问题,因为考虑到 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,如果设置为 1,则将来自 'acommand' 的错误发送到标准输出,并将常规标准输出发送到 /dev/null(这与如果 I/O 设置为 1 时的效果不同)重定向是相反的 - 这会将标准输出发送到 /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 重定向,您会看到相同的输出。

This uses bash arrays - but I see from the comments to another answer that the code isn't supposed to run under bash (despite the bash tag originally applied to the question); it is meant to run under the busybox shell.

I'm almost certain it doesn't answer the question because the question is substantially unanswerable given the limitations of busybox. In times past, I have used a custom program I called 'escape' to build up an argument string that can be eval'd to get the original arguments - spaces and all. But that requires support from outside the shell.


This solution only uses 'bash'. I'm not sure it is fully idiomatic bash code, but it works.

#!/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

The first loops builds up an array, args, with the arguments to the script, except it doesn't add '-Q' to the list and records its presence in variable Qflag.

The if statement at the end notes whether Qflag was set to 1, and if so, sends the errors from 'acommand' to standard output and sends regular standard output to /dev/null (which is different from the effect if the I/O redirections are reversed - that would send standard output to /dev/null and send standard error to the same place, forcing silence on 'acommand').

The use of 'exec' is a trivial optimization that simplifies exit status handling in this case.

Tested with 'acommand' that prints its arguments on separate lines:

#!/bin/sh
for arg in "$@"
do echo "$arg"
done

and with command lines such as:

bash wrapper.sh -c -d 'arg with spaces'

which produces the output:

-c
-d
arg with spaces

Obviously, with the I/O redirection in place, there is no output from:

bash wrapper.sh -c -Q -d 'arg with spaces'

However, if you omit the I/O redirection, you get to see the same output.

守不住的情 2024-08-15 12:30:41

遗憾的是,您需要处理参数中的空格,否则这可能会起作用:

#!/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 语言对其进行编码,这会有点难看。

It's a pity that you need to handle spaces in the arguments otherwise this might work:

#!/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

EDIT:

So this version handles spaces, at the expense of interpreting back-ticks.

#!/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

I think to have a complete solution you are going to have to code it in C, which will be a bit ugly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文