init - это
/bin/bash
Как я уже говорил на https://unix.stackexchange.com/a/197472/5132,
init=/bin/sh
не монтирует файловые системы "API", аварийно завершается без промывки кэша при набореexit
(https://unix.stackexchange.com/a/195978/5132), и вообще оставляет за (супер)пользователем право вручную выполнять действия, которые делают систему минимально пригодной для использования.Одним из таких действий (если вы хотите использовать оболочку управления заданиями, как вы, очевидно, делаете) является приобретение управляющего терминала.
/dev/tty
- это не настоящее терминальное устройство. Это устройство, которое перенаправляет на любой управляющий терминал открывающегося процесса. Если у него нет терминала, как не было у процесса №1 в начале (и обычно все время, когда реальная программа системного менеджера выполняется как процесс №1), то открытие устройства не удается.Ваша система слишком минимальна. Вам нужно запустить программу, которая устанавливает управляющий терминал, инициализирует правильный сеанс и, возможно, выполняет некоторые минимальные действия по управлению системой, такие как правильное и чистое выключение, а затем запускает оболочку управления работой.
Дальнейшее чтение
- Алан Кокс (2009-04-06). Linux Allocated Devices. 2.6+. kernel.org.
Есть несколько способов; напр. сsed
:
sed -i 's/^RELEASESTATUS=.*/&xyz/' keyvalue.txt
Это ищет строки, начинающиеся с RELEASESTATUS=
, совпадающие с полной строкой (благодаря .*
), и заменяет эти строки содержимым строки (&
), за которой следует xyz
.
Аналогичен ответу Стивена , но немного отличается по способу исполнения:
sed -i '/^RELEASESTATUS=/s/$/xyz/' keyvalue.txt
Вместо того, чтобы заменять всю строку своей копией с некоторым текстом, добавленным в конец, сначала находит правильную строку (строку, которая имеет RELEASESTATUS=
в самом начале ), а затем заменяет в необходимый текст в конце этой строки.
Здесь используется тот факт, что общая форма подстановочной команды(s
)в sed
такова:
start,end s/pattern/replacement/flags
где start
и end
задают диапазон строк, к которым должна быть применена команда, в виде начального и конечного адреса (, а «адрес» может быть номером строки, регулярным выражением или смещением ). При использовании одного адреса команда применяется только к этой строке (или к отдельным строкам, соответствующим определенному регулярному выражению ).
Вы также можете попробоватьawk
:
awk 'BEGIN { FS = OFS = "=" }; $1 == "RELEASESTATUS" { $2 = $2"xyz"; }; 1' keyvalue.txt
И если у вас есть GNU awk 4.1.0
или более поздняя версия, вы можете сделать это на месте:
gawk -i inplace -v INPLACE_SUFFIX=.bak 'BEGIN { FS = OFS = "=" }; $1 == "RELEASESTATUS" { $2 = $2"xyz"; }; 1' keyvalue.txt