grub-pc
установленный на Ubuntu)syslinux-common
и Ваш memdisk будет находиться в /usr/lib/syslinux/memdisk
sudo -s
mkdir -p /mnt/floppy
mount -o loop -t msdos fdboot.img /mnt/floppy
cp -via FLASH.EXE BIOS.IMG /mnt/floppy/
(FLASH.EXE
и BIOS.IMG
примеры),umount /mnt/floppy
linux16 (hd
. Теперь нажмите вкладку. Список жестких дисков покажут.linux16 (hd0,
, например./usr/lib/syslinux
смонтирован на в Вашей установке Linux.linux16 (hd0,msdos3)/usr/lib/syslinux/memdisk
. Нажмите Enter.fdboot.img
, но с командой initrd16
вместо linux16
. Вы закончите со строкой как это: initrd16 (hd0,msdos3)/home/janus/fdboot.img
. Нажмите Enter.boot
и нажмите Enter.FLASH.EXE
. Нажмите Enter.Если существует недостаточно пространства на изображении, используйте наименьшее изображение от chtaube.eu. Распакуйте изображение и отфильтруйте его хотя xxd
. Теперь поиск 55aa. Это должно быть в 0x1fe
. Можно смонтировать изображение с offset=$((0x200))
как дополнительный флаг монтирования. Остерегайтесь этого $(())
синтаксис является определенным для Bash, но будет также работать в Zsh.
С другой стороны, см. https://www.fladi.at/posts/large-freedos-boot-image/
Это не об эффективности - это о правильности. basename
новые строки использования для разграничивания имен файлов это распечатывает. В обычном случае, когда Вы только передаете одно имя файла, оно добавляет запаздывающую новую строку к своему выводу. Так как имена файлов могут содержать сами новые строки, это мешает правильно обрабатывать эти имена файлов.
Это далее осложнено фактом это, люди обычно используют basename
как это: "$(basename "$file")"
. Это делает вещи еще более трудными, потому что $(command)
полосы все запаздывающие новые строки от command
. Считайте маловероятный случай этим $file
концы с новой строкой. Затем basename
добавит дополнительная новая строка, но "$(basename "$file")"
разделит обе новых строки, оставляя Вас с неправильным именем файла.
Другая проблема с basename
это если $file
начинается с a -
(подчеркните штриховой линией иначе минус), это будет интерпретироваться как опция. Этого легко зафиксировать: $(basename -- "$file")
Устойчивый способ использовать basename
это:
# A file with three trailing newlines.
file=$'/tmp/evil\n\n\n'
# Add an 'x' so we can tell where $file's newlines end and basename's begin.
file_x="$(basename -- "$file"; printf x)"
# Strip off two trailing characters: the 'x' added by us and the newline added by basename.
base="${file_x%??}"
Альтернатива должна использовать ${file##*/}
, который легче, но имеет собственные ошибки. В частности, это неправильно в случаях где $file
/
или foo/
.
Соответствующие строки в shellcheck
исходный код:
checkNeedlessCommands (T_SimpleCommand id _ (w:_)) | w `isCommand` "dirname" =
style id "Use parameter expansion instead, such as ${var%/*}."
checkNeedlessCommands (T_SimpleCommand id _ (w:_)) | w `isCommand` "basename" =
style id "Use parameter expansion instead, such as ${var##*/}."
checkNeedlessCommands _ = return ()
Нет никакого объяснения, данного явно, но на основе названия функции (checkNeedlessCommands
) похоже, что @jordanm совершенно правилен, и это предлагает, чтобы Вы постарались не разветвлять новый процесс.
dirname
, basename
, readlink
и т.д. (благодарит @Marco - это исправлено), может создать проблемы мобильности, когда безопасность становится важной (требование безопасности пути). Много систем (как Fedora Linux) помещают его в /bin
тогда как другие (как MAC OSX) помещают его в /usr/bin
. Затем существует Bash в Windows, например, cygwin, msys, и другие. Всегда лучше остаться чистый Bash, если это возможно. (на комментарий @Marco)
BTW, спасибо за указатель на shellcheck, я не видел это прежде.
dirname
вообще. 3) Основные базовые утилиты должны быть в ПУТИ, везде, где они хранятся. Я еще не видел систему где basename
не был в ПУТИ. 4) Принятие удара доступно, проблема portibility. Всегда лучше избегать удара и использовать оболочку POSIX, когда мобильность требуется.
– Marco
10.10.2013, 02:03
posix
и нет bash
. Мне не удается найти любой индикатор, что OP требует решения для удара. Ваш оператор “It is always better to stay pure Bash” является просто неправильным, я сожалею.
– Marco
10.10.2013, 11:09
$file
foo/
? Что, если это/
? – Gilles 'SO- stop being evil' 10.10.2013, 01:17basename
подход лучше, в конце концов, как hacky как есть. Лучшие альтернативы, которые я могу придумать,${${${file}%%/#}##*/}
и[[ $file =~ "([^/]*)/*$" ]] && printf "%s" $match[1]
, оба из которых zsh-конкретны и ни один из которых обрабатывают/
правильно. – Matt 10.10.2013, 05:27