![Bash-Skript ändert das Verzeichnis nicht](https://rvso.com/image/83678/Bash-Skript%20%C3%A4ndert%20das%20Verzeichnis%20nicht.png)
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:
- Wählen Sie ein (erforderlich: Systempartition) oder zwei (optional: Datenpartition) Flashfire (Android) Backups,
- Exportiert Pfade und erstellt sechs Ordner (project_folder, project_folder/rom, project_folder/rom/data, projevt_folder/rom/system und zwei weitere)
- Fügt die Teile des Backups (es ist auf 1,07 GB aufgeteilt) in Daten- oder Systemordner zusammen und
- Ä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 pwd
sich 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 cd
was passiert, wenn ein Fehler auftritt? Überprüfen Sie immer, ob cd
der && ...
Test stattgefunden hat, oder set -e
brechen Sie ihn bei einem Fehler ab.