Тот же хороший ответ, но я могу принять только один - спасибо

учаю-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

 Charles Duffy25 авг. 2018 г., 19:19
... Мне нужно исправить себя там: пока этовозможно чтобы избежать разветвления в этом случае (например, ksh!), в bash через 4.4 - и потенциально вперед, пока кто-нибудь не отправит патч - это позволяет избежать толькоexec, неfork().
 Charles Duffy12 сент. 2017 г., 05:05
Как в сторону,var=$(cat somefile) более эффективно написаноvar=$(<somefile); последний вызов позволяет избежать как разветвления подоболочки, так и выполнения внешней команды (/bin/cat).

Ответы на вопрос(2)

Решение Вопроса

Читайте до первого NUL. Это более производительный подход, так как он не требует никаких внешних процессов для оболочки. Проверка того, является ли переменная назначения непустой после сбоя, обеспечивает успешное состояние выхода в случае, когда содержимое читается, но на входе отсутствует NUL (что в противном случае привело бы к ненулевому состоянию выхода).

IFS= read -r -d '' model </proc/device-tree/model || [[ $model ]]

Читайте игнорируя все NUL. Это приводит вас к поведению, эквивалентному новому (4.4) выпуску bash.

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

Вы также можете реализовать это, используя только встроенные функции следующим образом:

model=""
while IFS= read -r -d '' substring || [[ $substring ]]; do
  model+="$substring"
done </proc/device-tree/model
 Charles Duffy10 мар. 2018 г., 16:10
@SBF, этот синтаксис гарантирует, что команда возвращаетtrue если прочитал успешно прочитал что-нибудь, даже если этоне найти разделитель NUL в конце. Это работает, потому что[[ $foo ]] действует так же, как[ -n "$foo" ], проверяя, не является ли значение не пустым - такwhile условие истинно, если либоread вернул true (то есть нашел NUL),или же если переменная не пустая послеread сделано.
 SBF12 сент. 2017 г., 09:13
Я предпочитаю это:model=$(tr -d '\0' </proc/device-tree/model) - Я не понимаю|| [[ $model ]] синтаксис в первом и последнем примерах

Если вы просто хотите удалить нулевой байт:

model=$(tr -d '\0' < /proc/device-tree/model)
 SBF12 сент. 2017 г., 09:23
Тот же хороший ответ, но я могу принять только один - спасибо

Ваш ответ на вопрос