질문:
스크립트를 실행하여 변경된 내용을 취소하려면 스크립트를 작성해야 합니까?
그렇지 않은 경우 시스템에 적용된 변경 사항을 어떻게 정리/실행 취소하여 다음 작업을 수행할 수 있습니까?스크립트를 실행하기 전에 시스템 상태에서 스크립트를 다시 실행(변경)합니다.?
그렇다면 좋은 실행 취소 스크립트를 작성하려면 어떤 접근 방식을 취해야 합니까?
스크립트:github의 스크립트 링크
#!bin/bash
repos_dir="$HOME/repos"
if [ ! -d "$repos_dir" ]; then
mkdir -p "$repos_dir"
fi
git clone https://github.com/bashonregardless/dotfiles.git "$repos_dir/dotfiles"
software_dir="$HOME/software"
# Create a directory to download nvim software.
if test ! -d "$software_dir"; then
mkdir "$software_dir"
fi
(
cd "$software_dir"
# Download Neovim on Linux
if test $? = 0 && "$(command -v curl)" &> dev/null; then
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
chmod u+x nvim.appimage
else
echo "Error: curl is not installed"
echo
exit 64
fi
)
# Create "$HOME/bin" dir if it does not exist
if test ! -d "$HOME/bin"
then
mkdir "$HOME/bin"
fi
# Create a symbolic link in "$HOME/bin" dir to "$HOME/software/nvim"
ln "$software_dir/nvim.appimage" "$HOME/bin/nvim"
# Update vimrc at "$HOME/.vim/vimrc"
[ ! -d "$HOME/.vim" ] && mkdir "$HOME/.vim"
if [ ! -e "$HOME/.vim/vimrc" ]; then
# create a new file by copying dotfile vimrc
cp "$repos_dir/dotfiles/vimrc.template" "$HOME/.vim/vimrc"
else
cat "$repos_dir/dotfiles/vimrc.template" >> "$HOME/.vim/vimrc"
fi
# Update init.vim at "$HOME/.config/nvim/" (VIMCONFIG="$HOME/.config/nvim")
[ ! -d "$HOME/.config/nvim" ] && mkdir -p "$HOME/.config/nvim"
if [ ! -e "$HOME/.config/nvim/init.vim" ]; then
# create a new file by copying dotfile vimrc
cp "$repos_dir/dotfiles/init.vim.template" "$HOME/.config/nvim/init.vim"
else
cat "$repos_dir/dotfiles/init.vim.template" >> "$HOME/.config/nvim/init.vim"
fi
# add minpac vim plugin manager (See Modern vim craft)
[ ! -d "$HOME/.config/nvim/pack/minpac/opt" ] && mkdir -p "$HOME/.config/nvim/pack/minpac/opt"
cd "$HOME/.config/nvim/pack/minpac/opt"
git clone https://github.com/k-takata/minpac.git
cd -
# Update dotfiles (create, if non-existent)
if [ ! -e "$HOME/.bash_profile" ]; then
# Copy and rename in the same time
cp "$repos_dir/dotfiles/bash_profile" "$HOME/.bash_profile"
else
cat "$repos_dir/dotfiles/bash_profile" >> "$HOME/.bash_profile"
fi
if [ ! -e "$HOME/.bashrc" ]; then
cp "$repos_dir/dotfiles/bashrc" "$HOME/.bashrc"
else
cat "$repos_dir/dotfiles/bashrc" >> "$HOME/.bashrc"
fi
이 스크립트는 vim 개발 환경을 설정합니다. 스크립트를 작성하고 올바르게 설정하면 충분하다고 생각하여 처음 실행해 보았는데 작동했습니다. 그런 다음 스크립트를 일부 변경하고 제대로 실행되는지 테스트하고 싶었습니다. 이번에 실행하는 동안 다음과 같은 경고/오류/로그가 발생했습니다.
ln: '/home/user/bin/nvim' 하드 링크를 만들 수 없습니다: 파일이 존재합니다.
치명적: 대상 경로 '/home/user/repos/dotfiles'가 이미 존재하며 빈 디렉터리가 아닙니다.
몇개 써봤는데 cat file >> another-file
그거 하나another-file
스크립트가 실행될 때마다 중복된 콘텐츠가 추가됩니다. 나는 이것을 반드시 취소하고 싶다.
스크립트를 실행하여 시스템에 변경 사항이 적용되었습니다.
- ~/repos 디렉터리를 만듭니다.
- 저장소에서 dotfiles 저장소를 복제합니다.
- 저장소에서 compSc 저장소를 복제합니다.
- 집에서 소프트웨어 카탈로그를 만드십시오.
- 소프트웨어 디렉터리에서 nvim을 다운로드합니다.
- 다운로드한 파일 nvim.appimage의 권한을 변경합니다.
- 집에 bin 디렉터리를 만듭니다.
- ~/bin/nvim을 사용하여 nvim.appimage에 대한 심볼릭 링크를 만듭니다.
- ~/.vim/vimrc(mkdir -p)를 생성합니다.
- ~/.vim/vimrc에 복사/생성 또는 추가합니다.
- mkdir -p "$HOME/.config/nvim/pack/minpac/opt"
- k-takata/minpac indside "$HOME/.config/nvim/pack/minpac/opt" 복제
- "$HOME/.bash_profile"에 복사/생성 또는 추가
이것은 ~/.bash_profile 파일을 가져오기 전에 내 시스템에 적용된 변경 사항입니다. 소싱은 PATH 및 기타 환경 변수 업데이트 등 내 시스템을 추가로 변경했습니다.
또한 이러한 변경 사항을 취소하고 싶습니다.
테스트 목적으로 스크립트를 실행하기 전에 시스템 상태를 어떻게 복제할 수 있나요?
나는 사용한다여러 번 통과작은 변경이 있을 때마다 Ubuntu VM을 시작합니다. 스크립트를 실행한 후 가상 머신을 삭제하고 새 가상 머신을 시작했습니다. 이렇게 하면 처음으로 스크립트를 실행할 수 있는 상태의 머신이 제공됩니다. 저는 작은 변화가 있을 때마다 이렇게 합니다. 빨리 지루해집니다.
답변1
일반적으로 스크립트 효과는 안정적으로 실행 취소할 수 없습니다. 예를 들어 스크립트 시작 부분의 코드 조각은 다음과 같습니다.
if [ ! -d "$repos_dir" ]; then
mkdir -p "$repos_dir"
fi
이전에 얼마나 많은 디렉터리 경로가 존재했는지 나중에 알 수 없기 때문에 안정적으로 실행 취소할 수 없습니다 "$repos_dir"
.
스크립트를 완전히 취소할 수 없도록 하려면 필요한 경우 복원할 수 있도록 터치하기 전에 터치하는 모든 항목의 원래 상태를 기록해야 합니다. 이것이 패키지 관리자가 다양한 수준의 성공을 위해 시도하는 것입니다.
또 다른 방법은 스크립트를 갖는 것입니다멱등성. 즉, 두 번 실행하면 한 번 실행하는 것과 똑같은 효과가 나타납니다. 이는 Ansible 또는 Puppet과 같은 상태 저장 구성 관리 도구에 대한 접근 방식입니다.
"$repos_dir"
위의 코드 조각은 멱등성 코드의 전형적인 예입니다. 마지막 실행에서 디렉터리가 이미 존재했다면 아무 작업도 수행하지 않습니다.
코드 샘플은아니요cat file >> another-file
멱등성은 스크립트를 실행할 때마다 중복 콘텐츠를 추가하는 경우 입니다 . 멱등성을 가지려면 콘텐츠(또는 다른 버전)가 이미 에 있는지 another-file
확인한 다음 해당 콘텐츠를 먼저 제거하거나 다시 추가하지 않아야 합니다. 또는 콘텐츠 없이 기본 버전을 유지 하고 이를 사용하여 다음과 같이 연결할 수 있습니다.file
another-file
another-file
file
if [ ! -e another-file.base ]; then
mv another-file another-file.base
fi
cat another-file.base file > another-file