mirror of
https://github.com/LSPosed/MagiskOnWSALocal.git
synced 2025-04-25 17:59:35 +00:00
Merge branch 'LSPosed:main' into main
This commit is contained in:
commit
7d3d308812
4 changed files with 93 additions and 66 deletions
110
scripts/build.sh
110
scripts/build.sh
|
@ -158,6 +158,12 @@ vhdx_to_raw_img() {
|
|||
rm -f "$1" || return 1
|
||||
}
|
||||
|
||||
check_image_type() {
|
||||
local type
|
||||
type=$(blkid -o value -s TYPE "$1")
|
||||
echo "$type"
|
||||
}
|
||||
|
||||
mk_overlayfs() { # label lowerdir upperdir merged
|
||||
local context own
|
||||
local workdir="$WORK_DIR/worker/$1"
|
||||
|
@ -192,12 +198,17 @@ mk_overlayfs() { # label lowerdir upperdir merged
|
|||
sudo mount -vt overlay overlay -olowerdir="$lowerdir",upperdir="$upperdir",workdir="$workdir" "$merged" || return 1
|
||||
}
|
||||
|
||||
mk_erofs_umount() { # dir imgpath upperdir
|
||||
sudo "../bin/$HOST_ARCH/mkfs.erofs" -zlz4hc -T1230768000 --chunksize=4096 --exclude-regex="lost+found" "$2".erofs "$1" || abort "Failed to make erofs image from $1"
|
||||
mk_image_umount() { # dir imgpath upperdir imgtype
|
||||
echo "mk_image_umount: $*"
|
||||
if [ "$4" = "erofs" ]; then
|
||||
sudo "../bin/$HOST_ARCH/mkfs.erofs" -zlz4hc -T1230768000 --chunksize=4096 --exclude-regex="lost+found" "$2"."$4" "$1" || abort "Failed to make image for $1"
|
||||
elif [ "$4" = "ext4" ]; then
|
||||
abort "Not yet implemented"
|
||||
fi
|
||||
sudo umount -v "$1"
|
||||
sudo rm -f "$2"
|
||||
sudo mv "$2".erofs "$2"
|
||||
if [ "$3" ]; then
|
||||
sudo mv "$2"."$4" "$2"
|
||||
if [ -d "$3" ]; then
|
||||
sudo rm -rf "$3"
|
||||
fi
|
||||
}
|
||||
|
@ -479,13 +490,15 @@ update_gapps_zip_name() {
|
|||
}
|
||||
WSA_MAJOR_VER=0
|
||||
update_ksu_zip_name() {
|
||||
KERNEL_VER="5.15.94.4"
|
||||
if [ "$WSA_MAJOR_VER" -lt "2304" ]; then
|
||||
abort "KernelSU is not supported on WSA version below 2304"
|
||||
fi
|
||||
if [ "$WSA_MAJOR_VER" -ge "2306" ]; then
|
||||
KERNEL_VER="5.15.104.1"
|
||||
fi
|
||||
KERNEL_VER=""
|
||||
case "$WSA_MAJOR_VER" in
|
||||
"2305") KERNEL_VER="5.15.94.2";;
|
||||
"2306") KERNEL_VER="5.15.104.1";;
|
||||
"2307") KERNEL_VER="5.15.104.2";;
|
||||
"2308") KERNEL_VER="5.15.104.3";;
|
||||
"2309") KERNEL_VER="5.15.104.4";;
|
||||
*) abort "KernelSU is not supported in this WSA version: $WSA_MAJOR_VER"
|
||||
esac
|
||||
KERNELSU_ZIP_NAME=kernelsu-$ARCH-$KERNEL_VER.zip
|
||||
KERNELSU_PATH=$DOWNLOAD_DIR/$KERNELSU_ZIP_NAME
|
||||
KERNELSU_INFO="$KERNELSU_PATH.info"
|
||||
|
@ -498,6 +511,8 @@ if [ -z ${OFFLINE+x} ]; then
|
|||
# shellcheck disable=SC1090
|
||||
source "$WSA_WORK_ENV" || abort
|
||||
else
|
||||
echo "Generate Download Links"
|
||||
python3 generateWSALinks.py "$ARCH" "$RELEASE_TYPE" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$DOWN_WSA" || abort
|
||||
WSA_MAJOR_VER=$(python3 getWSAMajorVersion.py "$ARCH" "$WSA_ZIP_PATH")
|
||||
fi
|
||||
if [[ "$WSA_MAJOR_VER" -lt 2211 ]]; then
|
||||
|
@ -625,7 +640,7 @@ if [ "$GAPPS_BRAND" != 'none' ]; then
|
|||
abort "Unzip OpenGApps failed, is the download incomplete?"
|
||||
fi
|
||||
else
|
||||
if ! unzip "$GAPPS_PATH" "system/*" -x "system/addon.d/*" "system/system_ext/priv-app/SetupWizard/*" -d "$WORK_DIR/gapps"; then
|
||||
if ! unzip "$GAPPS_PATH" "system/*" -x "system/addon.d/*" "system/product/priv-app/VelvetTitan/*" "system/system_ext/priv-app/SetupWizard/*" -d "$WORK_DIR/gapps"; then
|
||||
CLEAN_DOWNLOAD_GAPPS=1
|
||||
abort "Unzip MindTheGapps failed, package is corrupted?"
|
||||
fi
|
||||
|
@ -639,40 +654,40 @@ if [ "$GAPPS_BRAND" != 'none' ]; then
|
|||
echo -e "Extract done\n"
|
||||
fi
|
||||
|
||||
if [[ "$WSA_MAJOR_VER" -ge 2302 ]]; then
|
||||
if [ -f "$WORK_DIR/wsa/$ARCH/system.vhdx" ]; then
|
||||
VM_IMAGES_USE_VHDX=1
|
||||
echo "Convert vhdx to RAW image"
|
||||
vhdx_to_raw_img "$WORK_DIR/wsa/$ARCH/system_ext.vhdx" "$WORK_DIR/wsa/$ARCH/system_ext.img" || abort
|
||||
vhdx_to_raw_img "$WORK_DIR/wsa/$ARCH/product.vhdx" "$WORK_DIR/wsa/$ARCH/product.img" || abort
|
||||
vhdx_to_raw_img "$WORK_DIR/wsa/$ARCH/system.vhdx" "$WORK_DIR/wsa/$ARCH/system.img" || abort
|
||||
vhdx_to_raw_img "$WORK_DIR/wsa/$ARCH/vendor.vhdx" "$WORK_DIR/wsa/$ARCH/vendor.img" || abort
|
||||
echo -e "Convert vhdx to RAW image done\n"
|
||||
fi
|
||||
|
||||
if [[ "$WSA_MAJOR_VER" -ge 2304 ]]; then
|
||||
SYSTEMIMAGES_FILE_SYSTEM_TYPE=$(check_image_type "$WORK_DIR/wsa/$ARCH/system.img")
|
||||
echo "Mount images"
|
||||
sudo mkdir -p -m 755 "$ROOT_MNT_RO" || abort
|
||||
sudo chown "0:0" "$ROOT_MNT_RO" || abort
|
||||
sudo setfattr -n security.selinux -v "u:object_r:rootfs:s0" "$ROOT_MNT_RO" || abort
|
||||
mount_erofs "$WORK_DIR/wsa/$ARCH/system.img" "$ROOT_MNT_RO" || abort
|
||||
mount_erofs "$WORK_DIR/wsa/$ARCH/vendor.img" "$VENDOR_MNT_RO" || abort
|
||||
mount_erofs "$WORK_DIR/wsa/$ARCH/product.img" "$PRODUCT_MNT_RO" || abort
|
||||
mount_erofs "$WORK_DIR/wsa/$ARCH/system_ext.img" "$SYSTEM_EXT_MNT_RO" || abort
|
||||
if [ "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" = "ext4" ]; then
|
||||
sudo mount -vo loop,ro "$WORK_DIR/wsa/$ARCH/system.img" "$ROOT_MNT_RO" || abort
|
||||
sudo mount -vo loop,ro "$WORK_DIR/wsa/$ARCH/vendor.img" "$VENDOR_MNT_RO" || abort
|
||||
sudo mount -vo loop,ro "$WORK_DIR/wsa/$ARCH/product.img" "$PRODUCT_MNT_RO" || abort
|
||||
sudo mount -vo loop,ro "$WORK_DIR/wsa/$ARCH/system_ext.img" "$SYSTEM_EXT_MNT_RO" || abort
|
||||
elif [ "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" = "erofs" ]; then
|
||||
mount_erofs "$WORK_DIR/wsa/$ARCH/system.img" "$ROOT_MNT_RO" || abort
|
||||
mount_erofs "$WORK_DIR/wsa/$ARCH/vendor.img" "$VENDOR_MNT_RO" || abort
|
||||
mount_erofs "$WORK_DIR/wsa/$ARCH/product.img" "$PRODUCT_MNT_RO" || abort
|
||||
mount_erofs "$WORK_DIR/wsa/$ARCH/system_ext.img" "$SYSTEM_EXT_MNT_RO" || abort
|
||||
else
|
||||
abort "Unknown file system type: $SYSTEMIMAGES_FILE_SYSTEM_TYPE"
|
||||
fi
|
||||
echo -e "done\n"
|
||||
echo "Create overlayfs for EROFS"
|
||||
echo "Create overlayfs"
|
||||
mk_overlayfs system "$ROOT_MNT_RO" "$SYSTEM_MNT_RW" "$ROOT_MNT" || abort
|
||||
mk_overlayfs vendor "$VENDOR_MNT_RO" "$VENDOR_MNT_RW" "$VENDOR_MNT" || abort
|
||||
mk_overlayfs product "$PRODUCT_MNT_RO" "$PRODUCT_MNT_RW" "$PRODUCT_MNT" || abort
|
||||
mk_overlayfs system_ext "$SYSTEM_EXT_MNT_RO" "$SYSTEM_EXT_MNT_RW" "$SYSTEM_EXT_MNT" || abort
|
||||
echo -e "Create overlayfs for EROFS done\n"
|
||||
elif [[ "$WSA_MAJOR_VER" -ge 2302 ]]; then
|
||||
echo "Remove read-only flag for read-only EXT4 image"
|
||||
ro_ext4_img_to_rw "$WORK_DIR/wsa/$ARCH/system_ext.img" || abort
|
||||
ro_ext4_img_to_rw "$WORK_DIR/wsa/$ARCH/product.img" || abort
|
||||
ro_ext4_img_to_rw "$WORK_DIR/wsa/$ARCH/system.img" || abort
|
||||
ro_ext4_img_to_rw "$WORK_DIR/wsa/$ARCH/vendor.img" || abort
|
||||
echo -e "Remove read-only flag for read-only EXT4 image done\n"
|
||||
fi
|
||||
if [[ "$WSA_MAJOR_VER" -lt 2304 ]]; then
|
||||
echo -e "Create overlayfs done\n"
|
||||
else
|
||||
echo "Calculate the required space"
|
||||
EXTRA_SIZE=10240
|
||||
|
||||
|
@ -740,7 +755,7 @@ if [ "$REMOVE_AMAZON" ]; then
|
|||
fi
|
||||
|
||||
echo "Add device administration features"
|
||||
sudo sed -i -e '/cts/a \ \ \ \ <feature name="android.software.device_admin" />' -e '/print/i \ \ \ \ <feature name="android.software.managed_users" />' "$VENDOR_MNT/etc/permissions/windows.permissions.xml"
|
||||
sudo sed -ie '/cts/a \ <feature name="android.software.device_admin" />' -e '/print/i \ <feature name="android.software.managed_users" />' "$VENDOR_MNT/etc/permissions/windows.permissions.xml"
|
||||
sudo setfattr -n security.selinux -v "u:object_r:vendor_configs_file:s0" "$VENDOR_MNT/etc/permissions/windows.permissions.xml" || abort
|
||||
echo -e "done\n"
|
||||
|
||||
|
@ -906,19 +921,26 @@ if [ "$GAPPS_BRAND" != 'none' ]; then
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$WSA_MAJOR_VER" -ge 2304 ]]; then
|
||||
echo "Create EROFS images"
|
||||
mk_erofs_umount "$VENDOR_MNT" "$WORK_DIR/wsa/$ARCH/vendor.img" "$VENDOR_MNT_RW" || abort
|
||||
mk_erofs_umount "$PRODUCT_MNT" "$WORK_DIR/wsa/$ARCH/product.img" "$PRODUCT_MNT_RW" || abort
|
||||
mk_erofs_umount "$SYSTEM_EXT_MNT" "$WORK_DIR/wsa/$ARCH/system_ext.img" "$SYSTEM_EXT_MNT_RW" || abort
|
||||
mk_erofs_umount "$ROOT_MNT" "$WORK_DIR/wsa/$ARCH/system.img" || abort
|
||||
echo -e "Create EROFS images done\n"
|
||||
if [ "$VM_IMAGES_USE_VHDX" ]; then
|
||||
echo "Create system images"
|
||||
mk_image_umount "$VENDOR_MNT" "$WORK_DIR/wsa/$ARCH/vendor.img" "$VENDOR_MNT_RW" "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" || abort
|
||||
mk_image_umount "$PRODUCT_MNT" "$WORK_DIR/wsa/$ARCH/product.img" "$PRODUCT_MNT_RW" "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" || abort
|
||||
mk_image_umount "$SYSTEM_EXT_MNT" "$WORK_DIR/wsa/$ARCH/system_ext.img" "$SYSTEM_EXT_MNT_RW" "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" || abort
|
||||
mk_image_umount "$ROOT_MNT" "$WORK_DIR/wsa/$ARCH/system.img" "$SYSTEM_MNT_RW" "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" || abort
|
||||
echo -e "Create system images done\n"
|
||||
echo "Umount images"
|
||||
sudo umount -v "$VENDOR_MNT_RO"
|
||||
sudo umount -v "$PRODUCT_MNT_RO"
|
||||
sudo umount -v "$SYSTEM_EXT_MNT_RO"
|
||||
sudo umount -v "$ROOT_MNT_RO"
|
||||
echo -e "done\n"
|
||||
echo "Convert images to vhdx"
|
||||
qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/system_ext.img" "$WORK_DIR/wsa/$ARCH/system_ext.vhdx" || abort
|
||||
qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/product.img" "$WORK_DIR/wsa/$ARCH/product.vhdx" || abort
|
||||
qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/system.img" "$WORK_DIR/wsa/$ARCH/system.vhdx" || abort
|
||||
qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/vendor.img" "$WORK_DIR/wsa/$ARCH/vendor.vhdx" || abort
|
||||
rm -f "$WORK_DIR/wsa/$ARCH/"*.img || abort
|
||||
echo -e "Convert images to vhdx done\n"
|
||||
else
|
||||
echo "Umount images"
|
||||
sudo find "$ROOT_MNT" -exec touch -ht 200901010000.00 {} \;
|
||||
|
@ -935,16 +957,6 @@ else
|
|||
echo -e "Shrink images done\n"
|
||||
fi
|
||||
|
||||
if [[ "$WSA_MAJOR_VER" -ge 2302 ]]; then
|
||||
echo "Convert images to vhdx"
|
||||
qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/system_ext.img" "$WORK_DIR/wsa/$ARCH/system_ext.vhdx" || abort
|
||||
qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/product.img" "$WORK_DIR/wsa/$ARCH/product.vhdx" || abort
|
||||
qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/system.img" "$WORK_DIR/wsa/$ARCH/system.vhdx" || abort
|
||||
qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/vendor.img" "$WORK_DIR/wsa/$ARCH/vendor.vhdx" || abort
|
||||
rm -f "$WORK_DIR/wsa/$ARCH/"*.img || abort
|
||||
echo -e "Convert images to vhdx done\n"
|
||||
fi
|
||||
|
||||
echo "Remove signature and add scripts"
|
||||
sudo rm -rf "${WORK_DIR:?}"/wsa/"$ARCH"/\[Content_Types\].xml "$WORK_DIR/wsa/$ARCH/AppxBlockMap.xml" "$WORK_DIR/wsa/$ARCH/AppxSignature.p7x" "$WORK_DIR/wsa/$ARCH/AppxMetadata" || abort
|
||||
cp "$vclibs_PATH" "$xaml_PATH" "$WORK_DIR/wsa/$ARCH" || abort
|
||||
|
|
|
@ -61,7 +61,7 @@ elif brand == "MindTheGapps":
|
|||
'.zip/download', '.zip').replace('sourceforge.net/projects/wsa-mtg/files', 'downloads.sourceforge.net/project/wsa-mtg')
|
||||
else:
|
||||
print(f"Failed to fetch from SourceForge RSS, fallbacking to Github API...", flush=True)
|
||||
res = requests.get(f"https://api.github.com/repos/Howard20181/MindTheGappsBuilder/releases/latest")
|
||||
res = requests.get(f"https://api.github.com/repos/MindTheGapps/{release}.0-{abi_map[arch]}/releases/latest")
|
||||
json_data = json.loads(res.content)
|
||||
headers = res.headers
|
||||
x_ratelimit_remaining = headers["x-ratelimit-remaining"]
|
||||
|
|
|
@ -61,6 +61,7 @@ download_dir = Path.cwd().parent / \
|
|||
"download" if sys.argv[3] == "" else Path(sys.argv[3])
|
||||
ms_account_conf = download_dir/".ms_account"
|
||||
tempScript = sys.argv[4]
|
||||
skip_wsa_download = sys.argv[5] == "no" if len(sys.argv) >= 6 else False
|
||||
cat_id = '858014f3-3934-4abe-8078-4aa193e74ca8'
|
||||
user = ''
|
||||
session = Session()
|
||||
|
@ -143,6 +144,13 @@ def send_req(i, v, out_file_name):
|
|||
|
||||
threads = []
|
||||
wsa_build_ver = 0
|
||||
for filename, values in identities.items():
|
||||
if re.match(f"MicrosoftCorporationII\.WindowsSubsystemForAndroid_.*\.msixbundle", filename):
|
||||
tmp_wsa_build_ver = re.search(u'\d{4}.\d{5}.\d{1,}.\d{1,}', filename).group()
|
||||
if(wsa_build_ver == 0):
|
||||
wsa_build_ver = tmp_wsa_build_ver
|
||||
elif version.parse(wsa_build_ver) < version.parse(tmp_wsa_build_ver):
|
||||
wsa_build_ver = tmp_wsa_build_ver
|
||||
for filename, values in identities.items():
|
||||
if re.match(f"Microsoft\.UI\.Xaml\..*_{arch}_.*\.appx", filename):
|
||||
out_file_name = f"{values[1]}_{arch}.appx"
|
||||
|
@ -153,20 +161,15 @@ for filename, values in identities.items():
|
|||
elif re.match(f"Microsoft\.VCLibs\..+_.*_{arch}_.*\.appx", filename):
|
||||
out_file_name = f"{values[1]}_{arch}.appx"
|
||||
out_file = download_dir / out_file_name
|
||||
elif re.match(f"MicrosoftCorporationII\.WindowsSubsystemForAndroid_.*\.msixbundle", filename):
|
||||
elif not skip_wsa_download and re.match(f"MicrosoftCorporationII\.WindowsSubsystemForAndroid_.*\.msixbundle", filename):
|
||||
tmp_wsa_build_ver = re.search(u'\d{4}.\d{5}.\d{1,}.\d{1,}', filename).group()
|
||||
if(wsa_build_ver == 0):
|
||||
wsa_build_ver = tmp_wsa_build_ver
|
||||
else:
|
||||
if version.parse(wsa_build_ver) < version.parse(tmp_wsa_build_ver):
|
||||
wsa_build_ver = tmp_wsa_build_ver
|
||||
else:
|
||||
continue
|
||||
version_splited = wsa_build_ver.split(".")
|
||||
major_ver = version_splited[0]
|
||||
minor_ver = version_splited[1]
|
||||
build_ver = version_splited[2]
|
||||
revision_ver = version_splited[3]
|
||||
if(wsa_build_ver != tmp_wsa_build_ver):
|
||||
continue
|
||||
version_splitted = wsa_build_ver.split(".")
|
||||
major_ver = version_splitted[0]
|
||||
minor_ver = version_splitted[1]
|
||||
build_ver = version_splitted[2]
|
||||
revision_ver = version_splitted[3]
|
||||
with open(os.environ['WSA_WORK_ENV'], 'r') as environ_file:
|
||||
env = Prop(environ_file.read())
|
||||
env.WSA_VER = wsa_build_ver
|
||||
|
|
|
@ -55,7 +55,7 @@ osrel=$(sed -n '/^ID_LIKE=/s/^.*=//p' /etc/os-release)
|
|||
declare -A os_pm_install
|
||||
# os_pm_install["/etc/redhat-release"]=yum
|
||||
os_pm_install["/etc/arch-release"]=pacman
|
||||
# os_pm_install["/etc/gentoo-release"]=emerge
|
||||
os_pm_install["/etc/gentoo-release"]=emerge
|
||||
os_pm_install["/etc/SuSE-release"]=zypper
|
||||
os_pm_install["/etc/debian_version"]=apt-get
|
||||
# os_pm_install["/etc/alpine-release"]=apk
|
||||
|
@ -63,7 +63,7 @@ os_pm_install["/etc/debian_version"]=apt-get
|
|||
declare -A PM_UPDATE_MAP
|
||||
PM_UPDATE_MAP["yum"]="check-update"
|
||||
PM_UPDATE_MAP["pacman"]="-Syu --noconfirm"
|
||||
PM_UPDATE_MAP["emerge"]="-auDN @world"
|
||||
PM_UPDATE_MAP["emerge"]="-auDU1 @world"
|
||||
PM_UPDATE_MAP["zypper"]="ref"
|
||||
PM_UPDATE_MAP["apt-get"]="update"
|
||||
PM_UPDATE_MAP["apk"]="update"
|
||||
|
@ -105,7 +105,8 @@ require_su
|
|||
if [ -z "$PM" ]; then
|
||||
echo "Unable to determine package manager: Unsupported distros"
|
||||
abort
|
||||
elif [ "$PM" = "pacman" ]; then
|
||||
elif [[ "$PM" =~ pacman|emerge ]]; then
|
||||
[ "$PM" = "emerge" ] && (sudo emerge -qoO aria2[adns] || abort)
|
||||
i=30
|
||||
while ((i-- > 1)) &&
|
||||
! read -r -sn 1 -t 1 -p $'\r:: Proceed with full system upgrade? Cancel after '$i$'s.. [y/N]\e[0K ' answer; do
|
||||
|
@ -149,6 +150,17 @@ if [ -n "${NEED_INSTALL[*]}" ]; then
|
|||
NEED_INSTALL_FIX=${NEED_INSTALL_FIX//p7zip-full/p7zip} 2>&1
|
||||
} >>/dev/null
|
||||
|
||||
readarray -td ' ' NEED_INSTALL <<<"$NEED_INSTALL_FIX "
|
||||
unset 'NEED_INSTALL[-1]'
|
||||
elif [ "$PM" = "emerge" ]; then
|
||||
NEED_INSTALL_FIX=${NEED_INSTALL[*]}
|
||||
{
|
||||
NEED_INSTALL_FIX=${NEED_INSTALL_FIX//whiptail/dialog} 2>&1
|
||||
NEED_INSTALL_FIX=${NEED_INSTALL_FIX//python3-pip/dev-python/pip} 2>&1
|
||||
NEED_INSTALL_FIX=${NEED_INSTALL_FIX//p7zip-full/p7zip} 2>&1
|
||||
NEED_INSTALL_FIX=${NEED_INSTALL_FIX//qemu-utils/qemu} 2>&1
|
||||
} >>/dev/null
|
||||
|
||||
readarray -td ' ' NEED_INSTALL <<<"$NEED_INSTALL_FIX "
|
||||
unset 'NEED_INSTALL[-1]'
|
||||
fi
|
||||
|
|
Loading…
Add table
Reference in a new issue