#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. Вы правы, что это проблема в исходном сценарии, но она несовместима с журналами операций, поэтому это не может быть проблемой, о которой они спрашивают. Если операция показывает что-то, что не может быть воспроизведено, этот вопрос должен быть закрыт, а не дан ответ.