При извлечении RPM на macOS с помощью скрипта bash, почему я не могу видеть файлы?

#bash #macos #rpm #rpmbuild

Вопрос:

У меня есть следующий исполняемый скрипт bash

 #!/usr/bin/env bash
function testRpm(){
    local rpm=$1
    local tempDir=$(mktemp -d)
    pushd $tempDir #>/dev/null
    rpm2cpio $rpm | cpio -idmuv
    find store -name "*.jar"
}
testRpm $1
 

Мне кажется, это довольно прямолинейно, извлеките RPM, покажите файлы. Проблема в том, что когда я запускаю его, поиск не показывает файлы, хотя он показывает каталоги. Если я вручную введу команды, это отлично сработает.

напр..

 bash -x ./test.sh myrpm.rpm
   testRpm myrpm.rpm
   local rpm=myrpm.rpm
   mktemp -d
   local tempDir=/var/folders/z4/7cl6z4_x5vq1dllx8l6vf73r0000gn/T/tmp.YWdEnKUG
   pushd /var/folders/z4/7cl6z4_x5vq1dllx8l6vf73r0000gn/T/tmp.YWdEnKUG
 /var/folders/z4/7cl6z4_x5vq1dllx8l6vf73r0000gn/T/tmp.YWdEnKUG
   ~/IdeaProjects
   rpm2cpio myrpm.rpm
   cpio -idmuv 
./store/tmp/myfile1 
./store/tmp/myfile2 
33279 blocks
   find store 
store
store/tmp
 

Приведенный выше сценарий, по-видимому, отлично работает на Redhat, но не на macos. Если у кого-нибудь есть какие-либо предложения, советы или решения, я был бы признателен.

Комментарии:

1. Кстати, pushd это интерактивное расширение, наличие которого не гарантируется для неинтерактивных оболочек. Подумайте только (cd /path/to/somewhere amp;amp; ...whatever...) о том , чтобы, когда оболочка, созданная круглой скобкой, заканчивается, вы автоматически выбрасывались в родительскую ячейку без необходимости запоминать, что нужно сделать popd . Если вы хотите избежать снижения производительности этой вложенной оболочки, просто сделайте так , чтобы последний исполняемый файл в ней был вызван exec , таким образом, используя вложенную оболочку для запуска процесса (вместо того, чтобы запускать процесс, создайте новую вложенную оболочку для использования execve() , как это принято по умолчанию).

2. Могу ли я попросить вас опубликовать конкретную частоту вращения, с помощью которой это можно проверить? Прямо сейчас никто, кроме вас myrpm.rpm , этого не сделал, так что мы не можем осмотреть его, чтобы понять, что происходит.

3. Я бы не очень удивился, если store/tmp бы это была символическая ссылка.

4. Я знаю, что pushd работает и извлечение работает, так как я могу проверить каталог и его содержимое. как насчет mirror.csclub.uwaterloo.ca/fedora/linux/development/rawhide/…

5. Я никогда не говорил вам, что переход на cd решит эту проблему. Я сказал вам только, что это может предотвратить другие проблемы в будущем.

Ответ №1:

Возможно , происходит то, что pushd , когда вы теряете доступ к файлу RPM, например, когда вы находитесь в /home/me «foo.rpm», это относится /home/me/foo.rpm , но когда вы меняете каталог на /tmp «foo.rpm», теперь относится /tmp/foo.rpm .

Решите эту проблему, используя абсолютный путь к RPM при извлечении с помощью realpath :

 #!/usr/bin/env bash
function testRpm(){
    local rpm=$(realpath -- "$1")
    local tempDir=$(mktemp -d)
    pushd $tempDir #>/dev/null
    rpm2cpio "$rpm" | cpio -idmuv
    find store -name "*.jar"
}
testRpm "$1"
 

Комментарии:

1. спасибо, но это не решило проблему, те же результаты. Я также заменил pushd на компакт-диск, без каких-либо улучшений. Я также добавил сон, просто потому, что это была странная проблема со временем.

2. после того, как $rpm извлечен, мне на это наплевать, tbh, я сохраняю его только для того, чтобы он возвращался пользователю.

3. Если бы это было проблемой, как бы cpio повторялись имена файлов?

4. Я только что протестировал, и это проблема в исходном сценарии, и это действительно устраняет эту проблему, поэтому я не уверен, почему был понижен голос. Я предполагаю, что проблема заключается в rpm2cpio том, что, возможно, он завернут или использует поддельный RPM, если он не может найти указанный.

5. Вы правы, что это проблема в исходном сценарии, но она несовместима с журналами операций, поэтому это не может быть проблемой, о которой они спрашивают. Если операция показывает что-то, что не может быть воспроизведено, этот вопрос должен быть закрыт, а не дан ответ.