Bash 腳本不會更改目錄

Bash 腳本不會更改目錄

首先,我沒有任何程式設計背景,只是將其作為業餘愛好。我的意思是:這是一種“愛好”,我這樣做是為了好玩。我從 6 週前開始,這裡所有類似腳本的內容都是互聯網研究和/或查看代碼並弄清楚運行 set -xe 時會發生什麼加上反複試驗的方法,所以不要指望過於出色的編碼和我問“愚蠢”的問題。

所以我有一個腳本,它可以讓你:

  1. 選擇一個(必要:系統分區)或兩個(可選:資料分區)flashfire (android) 備份,
  2. 匯出路徑並建立六個資料夾(project_folder、project_folder/rom、project_folder/rom/data、projevt_folder/rom/system 和另外兩個)
  3. 將備份的各個部分(分割為 1.07GB)重新加入資料或系統資料夾中,然後
  4. 將目錄變更為 .../system 或 .../data 並提取 data 或系統資料夾內的備份

除了將目錄更改為project_folder/rom/data 之外,這一切都運作得很好。

它總是說:

cd: ./project_folder/rom/data: No such file or directory

有趣的是,project_folder/rom/system 可以工作,並且將備份重新加入資料資料夾也可以工作。為什麼當腳本更改到資料資料夾時更改目錄不起作用?

這是不起作用的部分(系統起作用,數據不起作用):

EXT_SYS() {
# extract backups
echo "Extracting :"

echo "System partition backup..."
cd "$ACTIVE_DB/rom/system"
lz4 -dc --no-sparse system.tar.lz4 | tar xf -
}

EXT_DATA() {
# extract backups
echo "Data partition backup..."
cd "$ACTIVE_DB/rom/data"
lz4 -dc --no-sparse data.tar.lz4 | tar xf -
}

和其餘的

#!/bin/bash

PRINT_LINE3
echo "To create a DB make sure that you have:"
echo
echo "[REQUIRED] system.tlz4 and all system.*.tlz4 "
echo "[OPTIONAL] data.tlz4 and all data.*.tlz4"    
echo "in $BASE_DIR"
echo

local READY=0
while [[ $READY -eq 0 ]]; do
    echo
    echo "Please fill a path for your system.tlz4 file"
    echo "Potential candidates:"
    echo "=-=-=-=-=-=-=-=-="
    find ./base_drops -type f -iname "system.tlz4"
    echo "=-=-=-=-=-=-=-=-="
    read -p "system.tlz4: " SYSTEM_BAK

    echo
    echo "Please fill a path for your data.tlz4 file. Leave empty if none."
    echo "Potential candidates:"
    echo "=-=-=-=-=-=-=-=-="
    find ./base_drops -type f -iname "data.tlz4"
    echo "=-=-=-=-=-=-=-=-="
    read -p "data.tlz4: " DATA_BAK

    if [[ -f "$SYSTEM_BAK" ]] && ([[ -z "$DATA_BAK" || -f "$DATA_BAK" ]]); then
        READY=1
    else
        echo "Some of your files do not exist"
        PRESS_ENTER
    fi
done
# creates db dir plus subdirs if needed
PRINT_LINE3
read -p "Name your database: " NAME
echo
echo "backups: "
if [ -f  "$SYSTEM_BAK" ] ; then
    echo "  [SYS]  -> $SYSTEM_BAK"
fi
if [ -f  "$DATA_BAK" ] ; then
    echo "  [DATA] -> $DATA_BAK"
else
    echo "  no DATA "
fi
PRINT_LINE1
export ACTIVE_DB="./DB_$NAME"
export LIST_DIR="$ACTIVE_DB/lists"
export LOGS_DIR="$ACTIVE_DB/logs"
export ROM_DIR="$ACTIVE_DB/rom"
export SYS_DIR="$ACTIVE_DB/rom/system"
if [[ ! -z ${DATA_BAK+x} ]] ; then
    export DATA_DIR="$ACTIVE_DB/rom/data"
fi
echo "Creating $ACTIVE_DB, please wait..."
mkdir -p "$ACTIVE_DB"
mkdir -p "$LIST_DIR"
mkdir -p "$LOGS_DIR"
mkdir -p "$SYS_DIR"
if [[ ! -z "$DATA_BAK" ]] ; then  
   mkdir -p "$DATA_DIR"
fi
# SYSTEM
# find backup parts
echo "Merging: "
echo -n "System partition "
if [[ -f "./base_drops/system.0004.tlz4" ]] ; then
   export SYSTEM_BAK4="./base_drops/system.0004.tlz4"
   export SYSTEM_BAK3="./base_drops/system.0003.tlz4"
   export SYSTEM_BAK2="./base_drops/system.0002.tlz4" 
   cat "$SYSTEM_BAK" "$SYSTEM_BAK2" "$SYSTEM_BAK3" "$SYSTEM_BAK4" > "$ACTIVE_DB/rom/system/system.tar.lz4"        
   echo "(4 parts) -> $SYSTEM_BAK $SYSTEM_BAK2 $SYSTEM_BAK3 $SYSTEM_BAK4"    
else
    if [[ -f "./base_drops/system.0003.tlz4" ]] ; then
        export SYSTEM_BAK3="./base_drops/system.0003.tlz4"
        export SYSTEM_BAK2="./base_drops/system.0002.tlz4"  
        cat "$SYSTEM_BAK" "$SYSTEM_BAK2" "$SYSTEM_BAK3" > "$ACTIVE_DB/rom/system/system.tar.lz4"
        echo "(3 parts) -> $SYSTEM_BAK $SYSTEM_BAK2 $SYSTEM_BAK3"    
    else
        if [[ -f "./base_drops/system.0002.tlz4" ]] ; then
            export SYSTEM_BAK2="./base_drops/system.0002.tlz4"  
            cat "$SYSTEM_BAK" "$SYSTEM_BAK2" > "$ACTIVE_DB/rom/system/system.tar.lz4"
            echo "(2 parts) -> $SYSTEM_BAK $SYSTEM_BAK2"    
        fi
    fi
fi    
# /DATA-Partition backup
if [[ ! -z ${DATA_BAK+x} ]] ; then
echo -n  "Data partition:"
    if [[ -f "./base_drops/data.0004.tlz4" ]] ; then       # check for backup split-archive parts
        export DATA_BAK4="./base_drops/data.0004.tlz4"
        export DATA_BAK3="./base_drops/data.0003.tlz4"
        export DATA_BAK2="./base_drops/data.0002.tlz4"
        cat "$DATA_BAK" "$DATA_BAK2" "$DATA_BAK3" "$DATA_BAK4" > "$ACTIVE_DB/rom/data/data.tar.lz4"        # join into one archive
        echo "(4 parts) -> $DATA_BAK $DATA_BAK2 $DATA_BAK3 $DATA_BAK4"    
    else 
        if [[ -f "./base_drops/data.0003.tlz4" ]] ; then
            export DATA_BAK3="./base_drops/data.0003.tlz4"
            export DATA_BAK2="./base_drops/data.0002.tlz4"
            cat "$DATA_BAK" "$DATA_BAK2" "$DATA_BAK3" > "$ACTIVE_DB/rom/data/data.tar.lz4"
            echo "(3 parts) -> $DATA_BAK $DATA_BAK2 $DATA_BAK3"    
        else
            if [[ -f "./base_drops/data.0002.tlz4" ]] ; then
                export DATA_BAK2="./base_drops/data.0002.tlz4"
                cat "$DATA_BAK" "$DATA_BAK2" > "$ACTIVE_DB/rom/data/data.tar.lz4"
                echo "(2 parts) -> $DATA_BAK $DATA_BAK2"    
            fi
        fi
    fi
fi
EXT_SYS
EXT_DATA
# clean up
cd "$MAIN_DIR"
if [[ ! -z ${DATA_BAK+x} ]] ; then
    rm -f "$ACTIVE_DB/rom/data/data.tar.lz4"
    rm -f "$DATA_BAK1" 
    rm -f "$DATA_BAK2" 
    rm -f "$DATA_BAK3" 
    rm -f "$DATA_BAK4"
    rm -f "$ACTIVE_DB/rom/system/system.tar.lz4"
    rm -f "$SYSTEM_BAK1" 
    rm -f "$SYSTEM_BAK2" 
    rm -f "$SYSTEM_BAK3" 
    rm -f "$SYSTEM_BAK4"
else        
    rm -f "$ACTIVE_DB/rom/system/system.tar.lz4"
    rm -f "$SYSTEM_BAK1" 
    rm -f "$SYSTEM_BAK2" 
    rm -f "$SYSTEM_BAK3" 
    rm -f "$SYSTEM_BAK4"  
fi
echo "."
PRESS_ENTER

答案1

有多種選擇;我傾向於使用子shell

( cd some/dir && do_work )
( cd some/other/dir && do_more_work )

因為pwd只會在子 shell 內更改,而不會在父行程中更改。另一個選項是pushd/ popd

pushd some/dir
do_work
popd
pushd some/other/dir
do_even_more_work

還有一種方法是使用完全限定的路徑,它的好處是不關心先前的工作目錄在哪裡,儘管可以將程式碼與特定的檔案系統層次結構連結起來:

WORKDIR=/blah/de/blah
cd $WORKDIR/some/dir && do_work
cd $WORKDIR/some/other/dir && you_get_the_idea

錯誤檢查也很方便,因為cd可能會失敗,然後會發生什麼?始終檢查是否cd發生了(&& ...測試)或用於set -e避免任何失敗。

相關內容