우선 저는 프로그래밍에 대한 지식이 전혀 없고 그냥 취미로 하고 있습니다. 내 말은, 그것은 "취미"이고 재미를 위해 한다는 것입니다. 저는 6주 전에 시작했는데 여기서 스크립트처럼 보이는 모든 것은 인터넷 조사 및/또는 코드 보기 및 set -xe 실행 시 어떤 일이 발생하는지 알아내는 것과 시행착오 접근 방식이 혼합되어 있으므로 너무 많이 기대하지 마십시오. 내가 만든 멋진 코딩 "멍청한" 질문을 해보세요.
따라서 다음을 수행할 수 있는 스크립트가 있습니다.
- 하나(필수: 시스템 파티션) 또는 두 개(선택: 데이터 파티션) 플래시파이어(안드로이드) 백업을 선택하고,
- 경로를 내보내고 6개의 폴더(project_folder, project_folder/rom, project_folder/rom/data, projevt_folder/rom/system 외 2개)를 만듭니다.
- 백업의 다양한 부분(1.07GB로 분할)을 데이터 또는 시스템 폴더에 다시 결합한 다음
- 디렉토리를 .../system 또는 .../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
저는 서브쉘을 사용하는 경향이 있습니다.
( cd some/dir && do_work )
( cd some/other/dir && do_more_work )
pwd
상위 프로세스가 아닌 하위 쉘 내에서만 변경되기 때문입니다 . 또 다른 옵션은 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
실패를 방지하기 위해 사용하십시오.