摆脱“警告:命令替换:忽略输入中的空字节”

问题描述 投票:0回答:2

跑步时我会得到

-bash: warning: command substitution: ignored null byte in input
model=$(cat /proc/device-tree/model)

bash --version
GNU bash, version 4.4.12(1)-release (arm-unknown-linux-gnueabihf)

使用 bash 版本 4.3.30 就可以了

我知道问题是文件中的终止

\0
字符,但是我怎样才能抑制这个愚蠢的消息呢?因为我使用的是 bash 4.4,所以我的整个脚本都搞砸了

bash
2个回答
48
投票

如果你只想删除空字节:

model=$(tr -d '\0' < /proc/device-tree/model) 

在脚本中使用它:

/usr/bin/echo -e "Hardware:\t$(tr -d '\0' < /proc/devicetree/model)"

31
投票

您可能需要两种可能的行为:

  • 阅读直到第一个 NUL。这是性能更高的方法,因为它不需要 shell 的外部进程。失败后检查目标变量是否为非空可确保在读取内容但输入中不存在 NUL 的情况下成功退出状态(否则将导致非零退出状态)。

    IFS= read -r -d '' model </proc/device-tree/model || [[ $model ]]
    
  • 阅读时忽略所有 NUL。这将使您获得与 bash 新版本 (4.4) 相同的行为。

    model=$(tr -d '\0' </proc/device-tree/model)
    

    您也可以仅使用内置函数来实现它,如下所示:

    model=""
    while IFS= read -r -d '' substring || [[ $substring ]]; do
      model+="$substring"
    done </proc/device-tree/model
    
© www.soinside.com 2019 - 2024. All rights reserved.