在 MacO 上使用 bash 脚本提取 RPM 时,我怎么看不到文件?

问题描述

我有以下可执行的 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,显示文件。问题是当我运行它时,find 没有显示文件,但它显示了目录。如果我手动输入命令,效果很好。

例如

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 上运行不正常。如果有人有任何建议、提示解决方案,我将不胜感激。

解决方法

可能发生的情况是,当您 pushd 时,您将无法访问 RPM 文件,例如当您在 /home/me 中时,“foo.rpm”指的是 /home/me/foo.rpm,但是当您将目录更改为 /tmp 时,“foo.rpm”现在指的是 /tmp/foo.rpm

使用realpath提取时使用RPM的绝对路径来解决这个问题:

#!/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"