busybox sh 包装器添加额外的功能
我需要一个简单的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
可以在
busybox
的ash
shell 中完成这一切:It's possible to do it all in
busybox
'sash
shell:这使用 bash 数组 - 但我从评论中看到另一个答案是代码不应该在 bash 下运行(尽管 bash 标签最初应用于该问题);它旨在在 busybox shell 下运行。
我几乎可以肯定它不会回答这个问题,因为考虑到 busybox 的限制,这个问题基本上无法回答。在过去,我使用了一个名为“escape”的自定义程序来构建一个参数字符串,可以对其进行评估以获得原始参数 - 空格等。但这需要外壳外部的支持。
该解决方案仅使用“bash”。我不确定它是否完全符合惯用的 bash 代码,但它可以工作。
第一个循环使用脚本的参数构建一个数组 args,但它不会将“-Q”添加到列表中并将其存在记录在变量 Qflag 中。
最后的 if 语句记录 Qflag 是否设置为 1,如果设置为 1,则将来自 'acommand' 的错误发送到标准输出,并将常规标准输出发送到 /dev/null(这与如果 I/O 设置为 1 时的效果不同)重定向是相反的 - 这会将标准输出发送到 /dev/null 并将标准错误发送到同一位置,从而强制“acommand”保持沉默)。
使用“exec”是一个简单的优化,可以简化这种情况下的退出状态处理。
使用“acommand”进行测试,将其参数打印在单独的行上:
并使用诸如以下的命令行进行
测试:产生输出:
显然,在 I/O 重定向到位的情况下,没有输出:
但是,如果省略 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.
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:
and with command lines such as:
which produces the output:
Obviously, with the I/O redirection in place, there is no output from:
However, if you omit the I/O redirection, you get to see the same output.
遗憾的是,您需要处理参数中的空格,否则这可能会起作用:
编辑:
因此此版本处理空格,但以解释反引号为代价。
我认为要拥有一个完整的解决方案,您必须用 C 语言对其进行编码,这会有点难看。
It's a pity that you need to handle spaces in the arguments otherwise this might work:
EDIT:
So this version handles spaces, at the expense of interpreting back-ticks.
I think to have a complete solution you are going to have to code it in C, which will be a bit ugly.