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

时间:2017-09-11 20:12:22

标签: bash

我运行-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

,所以我的整个剧本都搞砸了

2 个答案:

答案 0 :(得分:11)

如果您只想删除空字节:

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

答案 1 :(得分:8)

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

  • 读到第一个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