Почему mkdir -p не работает правильно в сценарии, вызываемом checkinstall?

Я пытаюсь скомпилировать Quarter и упаковать его, используя checkinstall .

Если я сделаю стандартный ./configure && make && sudo make install, все будет хорошо.

$ wget http://ftp.coin3d.org/coin/src/all/Quarter-1.0.0.tar.gz
$ tar xzf Quarter-1.0.0.tar.gz
$ cd Quarter-1.0.0
$ ./configure
$ make
$ sudo make install

Но когда я использую checkinstall, он не работает на mkdir -p , который должен работать нормально. Это происходит именно так, как если бы не была указана опция -p . Это командная строка checkinstall, которую я использую:

$ checkinstall -D -y --install=no --pkgname=libquarter --pkgversion=1.0.0 \
  --arch=i386 --pkglicense=GPL --maintainer=me@example.com --reset-uids=yes

Это ошибка:

....
/bin/bash ../../../cfg/mkinstalldirs /usr/local/include/Quarter/devices
mkdir -p -- /usr/local/include/Quarter/devices
mkdir: cannot create directory `/usr/local/include/Quarter': No such file or directory
make[4]: *** [install-libdevicesincHEADERS] Error 1
....

Это соответствующая часть сценария:

$ cat cfg/mkinstalldirs
....
case $dirmode in
  '')
    if mkdir -p -- . 2>/dev/null; then
      echo "mkdir -p -- $*"
      exec mkdir -p -- "$@"
    fi
    ;;
....

Я не понимаю, почему там exec - не гарантирует ли это, что оставшаяся часть скрипта (после esac ) никогда не будет выполнена? (Если тест if пройден, то сценарий предполагает ] mkdir -p работает правильно, поэтому, как только он выполнит реальный mkdir -p , он может выйти; в противном случае оставшаяся часть скрипта реализует правильное поведение mkdir -p .) Я тоже не$ @ " в следующей строке, но это, кажется, не имеет значения - они оба одно и то же, поскольку этот сценарий вызывается только с одним аргументом. (Том объяснил в комментарии.)

Если я добавлю две строки между echo и exec , то получится mkdir -p - " $ @", а затем echo" Теперь выполняем exec mkdir ... " тогда он работает так - лучше, но все еще сбивает с толку:

/bin/bash ../../../cfg/mkinstalldirs /usr/local/include/Quarter/devices
mkdir -p -- /usr/local/include/Quarter/devices
mkdir: cannot create directory `/usr/local/include/Quarter': No such file or directory
Now doing the exec mkdir...
 /usr/bin/install -c -m 644 InputDevice.h /usr/local/include/Quarter/devices/InputDevice.h
.... finishes successfully!

Теперь, тот факт, что выполнение строки mkdir дважды приводило к он работает, говорит мне, что это не проблема с разрешениями (кроме того, это вызовет другую диагностику из mkdir, и это выполняется как sudo , и на самом деле он работает в / var / tmp / .. . не настоящий / usr / local / ... ). Я думаю, что происходит то, что первый вызов mkdir (тот, который я добавил) на самом деле создает только квартал и выгрузка, а затем, когда запускается второй mkdir, он может создать подкаталог devices , потому что каталог Quarter уже существует.Но почему mkdir работает таким образом ???

Мой обходной путь - каким-то образом исправить этот скрипт mkinstalldirs, но мне действительно любопытно, почему он ломается!

Это гость Ubuntu 10.10, работающая в VirtualBox на Win7, проверьте установку версия 1.6.2 установлена ​​через apt-get.


РЕДАКТИРОВАТЬ: Я провел небольшое тестирование, чтобы увидеть, что работает, а что нет в этой среде ...

mkdir -p /foo works correctly
mkdir -p /foo && mkdir -p /foo/bar works correctly
mkdir -p foo/bar works correctly
mkdir /foo/bar failed as expected (correct)
mkdir foo/bar failed as expected (correct)
mkdir -p /foo/bar fails

Странно, что -p работает для относительных путей, но не для абсолютных. Или, может быть, правильное различие состоит в том, что -p работает вне дерева «chroot» (если оно действительно использует chroot), но не внутри него.

Я также подтвердил, что, несмотря на сбой, он может для создания первого уровня каталога.

Все еще остается загадкой.

7
задан Dan 12 February 2011 в 01:13
поделиться