Bash-Skript ändert das Verzeichnis nicht

Bash-Skript ändert das Verzeichnis nicht

Erstens habe ich keine Programmierkenntnisse und mache das als Hobby in meiner Freizeit. Und damit meine ich: Es ist ein „Hobby“, ich mache es zum Spaß. Ich habe vor etwa 6 Wochen angefangen, alles Skriptartige hier ist eine Mischung aus Internetrecherche und/oder dem Betrachten von Code und dem Herausfinden, was passiert, wenn set -xe ausgeführt wird, plus Versuch und Irrtum, also erwarten Sie keinen übermäßig tollen Code und dass ich „dumme“ Fragen stelle.

Ich habe also ein Skript, mit dem Sie Folgendes tun können:

  1. Wählen Sie ein (erforderlich: Systempartition) oder zwei (optional: Datenpartition) Flashfire (Android) Backups,
  2. Exportiert Pfade und erstellt sechs Ordner (project_folder, project_folder/rom, project_folder/rom/data, projevt_folder/rom/system und zwei weitere)
  3. Fügt die Teile des Backups (es ist auf 1,07 GB aufgeteilt) in Daten- oder Systemordner zusammen und
  4. Ändert das Verzeichnis zu .../system oder .../data und extrahiert die Backups im Daten- oder Systemordner

Dies funktioniert alles ziemlich gut, außer dass das Verzeichnis in project_folder/rom/data geändert werden muss.

Es heißt immer:

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

Interessanterweise funktioniert project_folder/rom/system und auch das erneute Zusammenfügen des Backups in den Datenordner funktioniert. Warum funktioniert der Verzeichniswechsel nicht, sobald das Skript in den Datenordner wechseln soll?

Hier der Teil, der nicht funktioniert (System funktioniert, Daten nicht):

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 -
}

und der Rest davon

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

Antwort1

Es gibt eine Vielzahl von Optionen; ich neige dazu, Subshells zu verwenden

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

Da pwdsich dies nur innerhalb der Subshell ändert, nicht im übergeordneten Prozess. Eine andere Möglichkeit ist pushd/ popd:

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

Eine weitere Möglichkeit besteht darin, vollständig qualifizierte Pfade zu verwenden. Diese haben den Vorteil, dass das vorherige Arbeitsverzeichnis nicht berücksichtigt wird, binden den Code jedoch eher an eine bestimmte Dateisystemhierarchie:

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

Auch die Fehlerprüfung ist praktisch, denn cdwas passiert, wenn ein Fehler auftritt? Überprüfen Sie immer, ob cdder && ...Test stattgefunden hat, oder set -ebrechen Sie ihn bei einem Fehler ab.

verwandte Informationen