Вот рефакторинг, который также избегает надоедливого временного файла.
pw=$(openssl rand -base64 32)
useradd grub2superuseraccount
# Notice proper quoting
echo "$pw" | passwd grub2superuseraccount --stdin
# Collect output into a variable
grubpw=$(printf '%s\n' "$pw" "$pw" | grub2-mkpasswd-pbkdf2)
# Use the variable in sed -i
sed -i "/password_pbkdf2/a password_pbkdf2 $grubpw" conffile
В вашем вопросе не указано имя conffile
, поэтому замените его на имя файла, который вы действительно хотите запуститьsed -i
on.
Если вывод grub2-mkpasswd-pdkdf2
может содержать символы новой строки или другие проблемные символы, возможно, добавьте некоторые экранирующие символы в переменную.
Если вы действительно действительно хотите использовать канал, может быть, посмотрите в xargs
.
printf '%s\n' "$pw" "$pw" |
grub2-mkpasswd-pbkdf2 |
xargs -i sed -i "/password_pbkdf2/a password_pbkdf2 {}" conffile