【发布时间】:2018-05-13 03:21:03
【问题描述】:
我有以下 bash 脚本:
flag=false
command_name \
$( flag == false && printf %s '>/dev/null')
我希望终端没有输出,但我仍然得到一些。如果我将输出重定向到 /dev/null 与 command-name 的同一行而不进行扩展,那么它将被抑制。
命令是来自 android SDK 的 dx 工具
编辑 1: 这里是脚本中的代码
dx \
--dex \
$( ( (( flag_v == 1 )) || (( flag_v == 'd' ))) && printf %s '--verbose') \
--no-strict \
--output="../"$app_name.jar \
$(find . -type f -name '*.class') \
$( $dexflag == false && printf %s '>/dev/null')
当我运行该工具时,它按预期工作。我不认为这可能是错误流。
【问题讨论】:
-
通过shellcheck.net 运行您的代码(使用#!/bin/bash 作为第一行),然后如果您仍有问题,请使用没有语法问题的代码更新您的Q。另外,你知道
std-error的概念吗?您还需要将该流重定向到/dev/null。试试... > /dev/null 2>&1(我没有否决你的Q)。祝你好运。 -
扩展的结果,例如
$( ),不会被解析为代码。因此,如果这些结果本身包含扩展,它们将不会被兑现。这是一项功能,而不是错误——否则编写处理不受信任数据的 shell 脚本将是一场噩梦。 -
...上面假设
$dexflag == false是一个有效的陈述,但事实并非如此。 (如果dexflag为空,它将运行== false作为命令;如果是true,它将运行true == false作为命令;由于true命令忽略您的参数,结果将始终是true;如果$dexflag包含false,则false == false将始终返回false,因为false命令同样根本不查看其参数)。 -
而
(( ))是算术上下文;你不能在那里进行字符串比较(当它被允许时,它会将字符串评估为它们命名的变量的数值)。 -
(见标记的骗子,顺便说一句——这是一个很好的例子,说明问题应该是什么样子的,用最简单的代码来展示问题,无需任何工具即可运行/setup 需要)。
标签: bash terminal output-redirect