스크립트를 실행하여 시스템에 적용된 변경 사항을 실행 취소하는 쉘 스크립트를 작성합니다.

스크립트를 실행하여 시스템에 적용된 변경 사항을 실행 취소하는 쉘 스크립트를 작성합니다.

질문:

스크립트를 실행하여 변경된 내용을 취소하려면 스크립트를 작성해야 합니까?

그렇지 않은 경우 시스템에 적용된 변경 사항을 어떻게 정리/실행 취소하여 다음 작업을 수행할 수 있습니까?스크립트를 실행하기 전에 시스템 상태에서 스크립트를 다시 실행(변경)합니다.?

그렇다면 좋은 실행 취소 스크립트를 작성하려면 어떤 접근 방식을 취해야 합니까?


스크립트: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스크립트가 실행될 때마다 중복된 콘텐츠가 추가됩니다. 나는 이것을 반드시 취소하고 싶다.


스크립트를 실행하여 시스템에 변경 사항이 적용되었습니다.

  1. ~/repos 디렉터리를 만듭니다.
  2. 저장소에서 dotfiles 저장소를 복제합니다.
  3. 저장소에서 compSc 저장소를 복제합니다.
  4. 집에서 소프트웨어 카탈로그를 만드십시오.
  5. 소프트웨어 디렉터리에서 nvim을 다운로드합니다.
  6. 다운로드한 파일 nvim.appimage의 권한을 변경합니다.
  7. 집에 bin 디렉터리를 만듭니다.
  8. ~/bin/nvim을 사용하여 nvim.appimage에 대한 심볼릭 링크를 만듭니다.
  9. ~/.vim/vimrc(mkdir -p)를 생성합니다.
  10. ~/.vim/vimrc에 복사/생성 또는 추가합니다.
  11. mkdir -p "$HOME/.config/nvim/pack/minpac/opt"
  12. k-takata/minpac indside "$HOME/.config/nvim/pack/minpac/opt" 복제
  13. "$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확인한 다음 해당 콘텐츠를 먼저 제거하거나 다시 추가하지 않아야 합니다. 또는 콘텐츠 없이 기본 버전을 유지 하고 이를 사용하여 다음과 같이 연결할 수 있습니다.fileanother-fileanother-filefile

if [ ! -e another-file.base ]; then
  mv another-file another-file.base
fi
cat another-file.base file > another-file

관련 정보