LINUX.ORG.RU

Как сделать прозрачный cd для find | cpio?

 , ,


0

1

Пишу скрипт для генерации initrd, там нужно сделать find . | cpio из текущей директории, т.е. обязательно туда зайти, иначе cpio создаст initrd внутри которого будет лишняя директория, файлы будут лежать не в корне initrd как ./init, а как например, ./path/init.

https://github.com/sp00f1ng/boobstrap/blob/master/boobstrap.in#L175-L179

	cd $DIRECTORY
	case $OUTPUT in
		""|"-") find . -print0 | cpio --null --create --format=newc --verbose ;;
		*) find . -print0 | cpio --null --create --format=newc --verbose > $OUTPUT ;;
	esac

Из-за этого cd ломается весь скрипт, потому что когда делается cpio > initrd.img, мы находимся уже в другой директории, не откуда запускался скрипт, соответсвенно пытаясь сделать условный cpio > path/initrd.img, этот path/ находится там, где скрипт запущен, а не там, куда хочет записать cpio.

Что можно придумать в данной ситуации?

И да, всё делается на чистом POSIX shell, без башизмов.

★★★★★

Последнее исправление: Spoofing (всего исправлений: 2)

Ответ на: комментарий от gnu_linux

об этом оговорено, смотри, у тебя в корне / лежат /bin /etc, точно так же они должны лежать в корне initrd.img образа.

если делать find directory/, то он выведет список файлов следующим образом:

./directory/bin
./directory/etc
./directory/init

а должно быть как? а должно быть как у тебя

./bin
./etc
./init

а чтобы find сформировал список правильным образом, он должен быть внутри этой директории, т.е. cd необходим.

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Или так

(cd $DIRECTORY; find | cpio) > $OUTPUT
anonymous
()

Что можно придумать в данной ситуации?

Спуф, ну ты же вроде адекватный был? Что за детские вопросы?

path=$(pwd)
pushd $DIRECTORY
...
... cpio > "$path"/initrd.img
...
# optional:
popd
...
anonymous
()
Ответ на: комментарий от Spoofing

Можно так ещё:

pushd $DIRECTORY
...
... cpio > "$(dirs +1)"/initrd.img

Не знаю, правда, насчёт POSIX-совместимости.

anonymous
()
		""|"-") find . -print0 | cpio --null --create --format=newc --verbose ;;
		*) find . -print0 | cpio --null --create --format=newc --verbose > $OUTPUT ;;

Копипаст-программирование. Вынеси общую часть в отдельную функцию, чтобы не надо изменять нескольких местах.

anonymous
()

tags: bash

И да, всё делается на чистом POSIX shell, без башизмов.

Ты уж определись.

Ну и да: какой смысл огораживаться от башизмов на Linux, где Bash искаропки нет только на каком-нибудь embedded?

mord0d ★★★★★
()
Ответ на: комментарий от Spoofing

чтобы скрипт одинаково хорошо работал

на каком-нибудь embedded

Вот только там не будет работать ни ifconfig (просто потому что его там нет) ни базовые для десктопа утилиты, которыми ты пользуешься в своих скриптах. ☺

Пути у тебя десктопные, утилиты десктопные… В общем, ты огораживаешься просто для того, чтобы огородиться. Это я тебе как пользователь FreeBSD говорю, где Bash искаропки нет (он у меня установлен зависимостью password-store, но я принципиально не пользуюсь башизмами).

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

которыми ты пользуешься в своих скриптах

это называется «зависимости», которые удовлетворяются и всё начинает работать.

например. для работы нужен pkgadd, который часть CRUX, а чтобы его достать, приходилось скачивать целый ISO и выковыривать его оттуда. бред? бред. поэтому пришлось написать собственную простую реализацию. минус зависимость и лишние движения руками.

не скажу за *BSD, но я попробовал запустить свой бубстрап на Debian, а там locate оказывается нету из коробки. и скрипт не заработал. кто ж знал? такая базовая утилита, и нету. я думал она везде, как coreutils, ну не часть самого coreutils разумеется, но такая же часть системы. но нет. придётся добавлять в проверку test -x $(which locate)

grub i386 нету. при попытке установить, оно пытается удалить grub-efi.

The following packages will be REMOVED:
  grub-efi grub-efi-amd64 grub-imageboot grub2-common shim-signed

вот это вообще такой бред. глупый дебиян. как мне поставить grub-pc рядом с grub-efi? мне надо делать загрузочные iso чтобы и на bios и uefi работали, однако.

а про ifconfig не знаю, откуда ты взял такое, если только не для примера привёл, не пользуюсь им.

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

вот это вообще такой бред

О, тебе ещё многое предстоит узнать и возненавидеть. ☺

а про ifconfig не знаю, откуда ты взял такое, если только не для примера привёл, не пользуюсь им.

Для примера, конечно. У тебя многое в скрипте на веру (то же наличие подключения интернету, например).

Вообще, писание универсальной (поддерживающей несколько дистрибутивов) скриптоты под Linux — занятие крайне неблагодарное.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Ну и да: какой смысл огораживаться от башизмов на Linux, где Bash искаропки нет только на каком-нибудь embedded?

Он же пишет, что скрипт для initrd, куда обычно пихают busybox с ash, который намного ближе к posix sh.

anonymous
()

Может оно? и cd не надо

 -execdir command {} +
  Like -exec, but the specified command is run from the subdirectory containing the matched file
keir ★★
()
Ответ на: комментарий от anonymous

скрипт для initrd

Скрипт, насколько я понял, для создания initrd, а не для запуска из initrd (на самом деле initramfs, но сейчас это не важно).

mord0d ★★★★★
()
Ответ на: комментарий от Spoofing

Тоже обновляю скрипт работы с initrd. Для создания cpio пока такой код:

		if [ -n "${pack}" ]
		  then	cd "${src}" && find . | ${util} ${key} | ${pack} > "${dest}"
		  else	cd "${src}" && find . | ${util} ${key} > "${dest}"
		fi	# create

Ветка else - cpio без сжатия. Все переменные подготавливаются в другой функции, например: " dest=«${dest}/${src}${ext}» ". Если после этого, нужно вернуться в предыдущий каталог, то добавить строку: «cd «${OLDPWD}»».

andytux ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.