Git 소스를 자동으로 복제하기 위한 Linux 쉘 스크립트

Git 소스를 자동으로 복제하기 위한 Linux 쉘 스크립트

Git 소스를 자동으로 복제할 수 있는 셸 스크립트를 만들려고 합니다. 코드는 다음과 같습니다.

#!/bin/sh
mkdir /home/my-username/git-sources
cd home/my-username/git-sources

read gitsource

git clone $gitsource

echo "Please choose from the options bellow"

echo "1)Go back to your working directory"
echo "2) GO to the 'git-sources' folder"

read ans
back="1"
stay="2"
if [$ans == $back]; then
      cd -
elif [$ans == $stay]; then
      cd /home/my-username/git-sources
fi

내 문제는 12행에서 시작됩니다. 사용자에게 작업 디렉터리로 돌아갈 수 있는 옵션을 제공하고 싶지만 20행과 22행에서 명령을 찾을 수 없다는 오류가 발생합니다.

./git-installer.sh: line 20: [1: command not found
./git-installer.sh: line 21: [1: command not found

답변1

이 스크립트에는 많은 문제가 있습니다. 먼저 shellcheck스크립트와 유사한 도구가 이에 대해 말하는 내용을 확인해 보겠습니다 .lintshell

$ ~/.cabal/bin/shellcheck git-installer.sh

In git-installer.sh line 17:
if [$ans == $back]; then
^-- SC1009: The mentioned parser error was in this if expression.
   ^-- SC1035: You need a space after the [ and before the ].
   ^-- SC1073: Couldn't parse this test expression.
                  ^-- SC1020: You need a space before the ].
                  ^-- SC1072: Missing space before ]. Fix any mentioned problems and try again.

실수가 어디서 발생할 수 있는지, 실수를 피하기 위해 무엇을 해야 하는지에 대한 몇 가지 조언은 다음과 같습니다. 스크립트가 다음과 같이 보이도록 각 대괄호 앞뒤에 공백을 추가해야 합니다.

#!/bin/sh
mkdir /home/my-username/git-sources
cd home/my-username/git-sources

read gitsource

git clone $gitsource

echo "Please choose from the options bellow"

echo "1)Go back to your working directory"
echo "2) GO to the 'git-sources' folder"

read ans
back="1"
stay="2"
if [ $ans == $back ]; then
      cd -
elif [ $ans == $stay ]; then
      cd /home/my-username/git-sources
fi

하지만 shellcheck여전히 불행하다:

$ ~/.cabal/bin/shellcheck git-installer.sh

In git-installer.sh line 3:
cd home/my-username/git-sources
^-- SC2164: Use cd ... || exit in case cd fails.


In git-installer.sh line 5:
read gitsource
^-- SC2162: read without -r will mangle backslashes.


In git-installer.sh line 7:
git clone $gitsource
          ^-- SC2086: Double quote to prevent globbing and word splitting.


In git-installer.sh line 14:
read ans
^-- SC2162: read without -r will mangle backslashes.


In git-installer.sh line 17:
if [ $ans == $back ]; then
     ^-- SC2086: Double quote to prevent globbing and word splitting.
          ^-- SC2039: In POSIX sh, == in place of = is undefined.


In git-installer.sh line 18:
      cd -
      ^-- SC2164: Use cd ... || exit in case cd fails.


In git-installer.sh line 19:
elif [ $ans == $stay ]; then
       ^-- SC2086: Double quote to prevent globbing and word splitting.
            ^-- SC2039: In POSIX sh, == in place of = is undefined.


In git-installer.sh line 20:
      cd /home/my-username/git-sources
      ^-- SC2164: Use cd ... || exit in case cd fails.

보고된 모든 오류 및 경고를 수정하는 것 외에도 shellcheck이 스크립트를 더욱 개선할 수 있습니다.

스크립트가 모든 사용자에게 작동하도록 "$HOME"대신 간단하고 명확하게 사용할 수 있습니다 ./home/my-username

또한 mkdir디렉터리가 아직 존재하지 않는 경우에만 이 작업을 맨 위에서 수행해야 합니다. File exists그렇지 않으면 오류가 발생합니다.

사용자에게 우리가 기대하는 입력이 무엇인지 알려주는 프롬프트를 인쇄할 수 있다면 좋을 것입니다.

또한 상상할 수 있는 방식으로 실행하려면 이 스크립트를 실행하는 대신 cd사용해야 합니다 . source즉, 필요에 따라 생성한 변수를 설정 해제하여 사용자 환경을 정리해야 합니다.

요약하면 다음과 같아야 합니다.

#!/bin/sh

if [ ! -d "$HOME"/git-sources ]; then
    mkdir "$HOME"/git-sources
fi

cd "$HOME"/git-sources || { printf "cd failed, exiting\n" >&2;  return 1; }

printf "Gitsource: "
read -r gitsource

git clone "$gitsource"

unset gitsource

echo "Please choose from the options bellow"

echo "1) Go back to your working directory"
echo "2) Go to the 'git-sources' folder"

read -r ans
back="1"
stay="2"
if [ "$ans" = "$back" ]; then
      cd - || { printf "cd failed, exiting\n" >&2; unset ans; return 1; }
elif [ "$ans" = "$stay" ]; then
      cd "$HOME"/git-sources || { printf "cd failed, exiting\n" >&2; unset ans; return 1; }
fi

unset ans

원천:

$ . git-installer.sh
Gitsource: https://github.com/antirez/linenoise
Cloning into 'linenoise'...
remote: Counting objects: 396, done.
remote: Total 396 (delta 0), reused 0 (delta 0), pack-reused 396
Receiving objects: 100% (396/396), 114.69 KiB | 0 bytes/s, done.
Resolving deltas: 100% (232/232), done.
Checking connectivity... done.
Please choose from the options bellow
1) Go back to your working directory
2) Go to the 'git-sources' folder
2
$ pwd
/home/ja/git-sources
$ ls -Al
total 4
drwxr-xr-x 3 ja users 4096 Dec 25 22:48 linenoise

답변2

저도 같은 문제가 있었고 모든 GitHub 리포지토리(모든 브랜치)를 복제하여 폴더에 백업하고 싶었습니다. 이 작업을 수행하기 위해 여기에 있는 Python 스크립트를 만들었습니다.https://github.com/tisma95/github-clone원한다면 시도해 볼 수 있습니다.

감사해요

관련 정보