Необходимо выполнить команду в ее собственном экземпляре оболочки.
nohup sh -c 'nc -l -p 4000 | dd of=/home/myname/test.txt 2>/run/user/myname/stderr 1>/run/user/myname/stdout' &
Для меня это был очень конкретный ответ, но я хочу объяснить в более общем виде, как это устранять.
На самом деле большая часть информации уже содержится в сообщении об ошибке, но сначала для меня это было неочевидно.
Вкратце:
/etc/grub.d/proxifiedScripts/
. /boot/grub/grub.cfg
автоматически создается в «update-grub» на основе ряда файлов: / etc / default / grub
и любые файлы в /etc/grub.d / *
.
/boot/grub/grub.cfg.new
Однако в случае синтаксической ошибки (или любой другой, я полагаю) исходный /boot/grub/grub.cfg
НЕ перезаписывается, а вместо этого создается новый файл в /boot/grub/grub.cfg.new
.
Сообщение об ошибке содержит номер строки, в моем случае 262, которая относится к этому файлу /boot/grub/grub.cfg.new
. В моем случае это было 262. Посмотрев файл, я обнаружил следующее:
### BEGIN /etc/grub.d/60_memtest86+_proxy ###
if [ "${grub_platform}" == "pc" ]; then
fi
### END /etc/grub.d/60_memtest86+_proxy ###
Я узнал, что пустой блок if / then / fi в сценарии оболочки недопустим, поэтому это была синтаксическая ошибка. Довольно глупый дизайн языка imo, но так оно и есть.
Я также нашел исправление, которое заключается в добавлении в блок бессмысленного оператора. Предлагалось двоеточие, но могли быть и другие решения.
### BEGIN /etc/grub.d/60_memtest86+_proxy ###
if [ "${grub_platform}" == "pc" ]; then
:
fi
### END /etc/grub.d/60_memtest86+_proxy ###
Еще лучше было бы полностью удалить этот бессмысленный блок.
Сейчас мы действительно не хотим редактировать этот файл вручную, потому что изменения будут стерты при следующем update-grub (в случае успеха, что является целью).
/etc/grub.d / *
Фрагмент кода содержит подсказку, где искать дальше: /etc/grub.d/60_memtest86+_proxy
. В этом файле написано:
#!/bin/sh
#THIS IS A GRUB PROXY SCRIPT
'/etc/grub.d/proxifiedScripts/memtest86+' | /etc/grub.d/bin/grubcfg_proxy "+*
+#text
-'Memory Tester (memtest86+)'~30b99791e52c3f0cb32601c5b8f57cc7~
"
/etc/grub.d/proxifiedScripts / *
Соответствующая часть /etc/grub.d/proxifiedScripts/memtest86+
такова:
[..]
cat << EOF
if [ "\${grub_platform}" == "pc" ]; then
menuentry "Memory Tester (memtest86+)" ${CLASS} {
search --fs-uuid --no-floppy --set=root ${_GRUB_MEMTEST_HINTS_STRING} ${_GRUB_MEMTEST_FS_UUID}
linux16 ${_GRUB_MEMTEST_REL_PATH} ${GRUB_CMDLINE_MEMTEST86}
}
fi
EOF
[..]
Сам файл сценарий оболочки, но в нем есть "кошачьи" операторы. Они печатают фрагменты сценария оболочки, которые в конечном итоге должны войти в /boot/grub/grub.cfg
. Возможно, с некоторыми изменениями.
В /boot/grub/grub.cfg.new
мы видим, что элемент «menuentry ...» фактически отсутствует, и вместо этого мы получаем пустой блок then..fi. Почему пропадает "menuentry ...", я не знаю.Может grub думает, что это не нужно. К сожалению, удаление ломает скрипт.
Трюк / обходной путь заключался в добавлении двоеточия в этот файл, например:
if [ "\${grub_platform}" == "pc" ]; then
:
menuentry "Memory Tester (memtest86+)" ${CLASS} {
search --fs-uuid --no-floppy --set=root ${_GRUB_MEMTEST_HINTS_STRING} ${_GRUB_MEMTEST_FS_UUID}
linux16 ${_GRUB_MEMTEST_REL_PATH} ${GRUB_CMDLINE_MEMTEST86}
}
При запуске update-grub генерируется grub.cfg
с обходным путем, описанным выше.
Папка /etc/grub.d/
в моей системе фактически содержала два файла для memtest86 + _proxy: 60_memtest86 + _proxy
и 62_memtest86 + _proxy
. Я предполагаю, что один из них - что-то вроде пережитка. Но у них обоих одна и та же обновленная временная метка, поэтому я действительно не знаю, какие из них можно было бы безопасно удалить. Отличие показывает следующее:
--- /etc/grub.d/60_memtest86+_proxy 2015-01-08 15:54:02.228927526 +0100
+++ /etc/grub.d/62_memtest86+_proxy 2015-01-08 15:54:02.228927526 +0100
@@ -1,6 +1,6 @@
#!/bin/sh
#THIS IS A GRUB PROXY SCRIPT
-'/etc/grub.d/proxifiedScripts/memtest86+' | /etc/grub.d/bin/grubcfg_proxy "+*
-+#text
--'Memory Tester (memtest86+)'~30b99791e52c3f0cb32601c5b8f57cc7~
+'/etc/grub.d/proxifiedScripts/memtest86+' | /etc/grub.d/bin/grubcfg_proxy "+'Memory Tester (memtest86+)'~30b99791e52c3f0cb32601c5b8f57cc7~
+-*
+-#text
"
\ No newline at end of file
Итак, оба файла относятся к одному и тому же проксифицированному сценарию, но результат передается через двоичный файл grubcfg_proxy с разными параметрами. Эти различные параметры могут быть ответственны за удаление материала «menuentry ...» в случае 60_memtest86 + _proxy
.
У других могут быть совершенно другие проблемы. Но поиск и устранение неисправностей, по крайней мере, первые шаги, должны быть очень похожими.
Спасибо, это действительно помогло мне.
В моем случае это был тот самый файл/etc/grub.d/proxifiedScripts/custom
Я попытался создать собственный скрипт с помощью grub-customizer
для загрузки Prime OS из каталога в корневом каталоге.
Я удалил файл, затем команда update-grub
выполнена без ошибок затем я перегенерировал пользовательский скрипт, используя grub-customizer
, и он работает хорошо.
У меня была такая же проблема с Xubuntu 18.04, но я не смог найти ничего неправильного в файлах /etc/default/grub или /etc/grub.d
Так как я смог получить доступ к системе, несмотря на ошибку, мне не пришлось входить в нее через chroot, что будет необходимо, если вы не можете загрузиться в систему. Что я сделал, так это очистил и переустановил grub, что помогло.
Я использовал следующие шаги:
sudo apt-get update # ***
sudo apt-get purge grub-pc grub-common
apt-get install grub-common grub-pc
и при появлении запроса нажал TAB , чтобы выделить «», и нажал ENTERПри появлении варианта устройства я использовал клавиши UP/DN для выбора правильного диска (sdX ), НЕ являющегося разделом.
Я убедился, что рядом с установочным диском [ ] /dev/sdX стоит звездочка (в моем случае :[ ] /dev/sda ). Если это не так, выделите его и нажмите клавишу ПРОБЕЛ, чтобы выбрать его. Затем я нажал TAB , чтобы выделить «», и нажал ENTER
.Я проверил, что установка завершена и работает, введя команду sudo update-grub
, и все работало без ошибок, как и ожидалось.
Согласно ответу @donquixote -у меня также были точно такие же файлы 60_memtest86+_proxy
и 62_memtest86+_proxy
в /etc/grub.d/
. Запуск update-grub
привел к синтаксическим ошибкам в моем /boot/grub/grub.cfg
, который читал:
### BEGIN /etc/grub.d/~60_memtest86+_proxy ###
if [ "${grub_platform}" == "pc" ]; then
fi
### END /etc/grub.d/~60_memtest86+_proxy ###
### BEGIN /etc/grub.d/62_memtest86+_proxy ###
menuentry "Memory Tester (memtest86+)" --class memtest86 --class gnu --class tool {
search --fs-uuid --no-floppy --set=root --hint-ieee1275='ieee1275//disk@0,gpt5' --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5 afa594f4-80a8-4a18-8df5-53d58be8651a
linux16 /boot/memtest86+/memtest.bin
}
### END /etc/grub.d/62_memtest86+_proxy ###
Чтобы решить эту проблему, я просто удалил 60_memtest86+_proxy
, который создавал пустой оператор if
. Это наконец заставило update-grub
работать.
В Manjaro Linux я столкнулся с той же проблемой. Я получил намек на свое исправление, прочитав самый популярный ответ @donquixote.
Отредактируйте файл /etc/grub.d/proxifiedScripts/memtest86+
и добавьте :
между последним блоком if
...
if [ "\${grub_platform}" == "pc" ]; then
:
menuentry "Memory Tester (memtest86+)" ${CLASS} {
search --fs-uuid --no-floppy --set=root ${_GRUB_MEMTEST_HINTS_STRING} ${_GRUB_MEMTEST_FS_UUID}
linux16 ${_GRUB_MEMTEST_REL_PATH} ${GRUB_CMDLINE_MEMTEST86}
}
fi
...
Затем запустите sudo update-grub
, и он должен завершиться успешно.