Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

초보자를 위한 명령줄 – 프로처럼 터미널을 사용하는 방법 [전체 핸드북]

안녕하세요 여러분! 이 기사에서는 명령줄(CLI, 콘솔, 터미널 또는 셸이라고도 함)을 자세히 살펴보겠습니다.

명령줄은 일반적으로 개발자 및 컴퓨터 사용자로서 가장 유용하고 효율적인 도구 중 하나입니다. 하지만 처음 사용하는 경우에는 다소 부담스럽고 ​​복잡하게 느껴질 수 있습니다.

이 기사에서는 명령줄 인터페이스를 구성하는 부분과 작동 방식의 기본 사항을 간단하게 설명하여 일상적인 작업에 사용할 수 있도록 최선을 다할 것입니다.

갑시다! =D

목차

  • 콘솔, 터미널, 명령줄(CLI)과 셸의 차이점
    • 콘솔
    • 터미널
    • 명령줄(CLI)
  • 왜 터미널 사용에 신경을 써야 하나요?
  • 다양한 종류의 조개
    • 약간의 역사 - Posix
    • 실행 중인 쉘을 어떻게 알 수 있나요?
    • 어떤 쉘이 더 낫습니까?
      • 맞춤화에 대한 의견
  • 가장 일반적이고 유용한 명령어
    • Git 명령
  • 첫 스크립트
  • 반올림

콘솔, 명령줄(CLI), 터미널 및 셸의 차이점

명령줄이 무엇인지 정확히 아는 것부터 시작하는 것이 좋습니다.

이것을 언급할 때 터미널, 콘솔, 명령줄, CLI 및 셸이라는 용어를 들어보았을 것입니다. 사람들은 종종 이 단어를 같은 의미로 사용하지만 실제로는 다른 단어입니다.

각각을 구별하는 것이 꼭 필요한 중요한 지식은 아니지만, 사물을 명확히 하는 데 도움이 됩니다. 그럼 각각에 대해 간단히 설명하겠습니다.

콘솔:

콘솔은 물리적 기기입니다. 컴퓨터와 상호 작용할 수 있습니다.

일반 영어로 컴퓨터 화면, 키보드 및 마우스입니다. 사용자는 다음을 통해 컴퓨터와 상호작용합니다. 콘솔.

초보자를 위한 명령줄 – 프로처럼 터미널을 사용하는 방법 [전체 핸드북]

터미널:

터미널은 텍스트 입력 및 출력 환경입니다. 프로그램입니다. 래퍼 역할 컴퓨터가 처리하는 명령을 입력할 수 있습니다.

일반 영어로 다시 말하면 컴퓨터가 처리할 실제 명령을 입력하는 "창"입니다.

초보자를 위한 명령줄 – 프로처럼 터미널을 사용하는 방법 [전체 핸드북]

터미널은 다른 것과 마찬가지로 프로그램이라는 점을 명심하십시오. 다른 프로그램과 마찬가지로 원하는 대로 설치하고 제거할 수 있습니다. 또한 컴퓨터에 여러 개의 터미널을 설치하여 원할 때마다 원하는 대로 실행할 수도 있습니다.

모든 운영 체제에는 기본 터미널이 설치된 상태로 제공되지만 각각 고유한 기능과 특징을 가진 선택할 수 있는 옵션이 많이 있습니다.

쉘:

셸은 프로그램입니다. 명령줄 인터프리터 역할을 합니다. 명령을 처리합니다. 결과 출력 . 사용자가 입력한 명령을 해석하고 처리합니다.

터미널과 마찬가지로 셸은 모든 운영 체제에 기본적으로 제공되는 프로그램이지만 사용자가 설치 및 제거할 수도 있습니다.

쉘마다 구문과 특성이 다릅니다. 또한 컴퓨터에 많은 셸을 설치하고 원할 때마다 각각을 실행할 수도 있습니다.

대부분의 Linux 및 Mac 운영 체제에서 기본 셸은 Bash입니다. Windows에서는 Powershell입니다. 쉘의 다른 일반적인 예는 Zsh와 Fish입니다.

쉘은 프로그래밍 언어로도 작동합니다. , 그것들로 스크립트를 만들 수 있다는 의미에서 컴퓨터가 특정 작업을 실행하게 하기 위해. 스크립트는 파일에 저장하고 나중에 원할 때마다 실행할 수 있는 일련의 명령(명령)에 불과합니다.

이 기사의 뒷부분에서 스크립트를 살펴보겠습니다. 지금은 쉘이 컴퓨터가 명령을 "이해"하고 실행하는 데 사용하는 프로그램이며 작업을 프로그래밍하는 데 사용할 수도 있다는 점을 명심하십시오.

또한 터미널은 쉘이 실행될 프로그램이라는 점을 명심하십시오. 그러나 두 프로그램 모두 독립적입니다. 즉, 모든 터미널에서 모든 쉘을 실행할 수 있습니다. 그런 의미에서 두 프로그램 사이에는 종속성이 없습니다.

명령줄 또는 CLI(명령줄 인터페이스):

CLI는 컴퓨터가 처리할 명령을 입력하는 인터페이스입니다. 다시 한 번 일반 영어로 컴퓨터가 처리할 명령을 입력하는 공간입니다.

초보자를 위한 명령줄 – 프로처럼 터미널을 사용하는 방법 [전체 핸드북]

이것은 터미널과 거의 동일하며 제 생각에는 이러한 용어를 서로 바꿔서 사용할 수 있습니다.

여기서 언급할 흥미로운 점은 대부분의 운영 체제에는 두 가지 유형의 인터페이스가 있다는 것입니다.

  • CLI , 컴퓨터가 작업을 실행하기 위해 명령을 입력으로 사용합니다.
  • 다른 하나는 GUI입니다. (그래픽 사용자 인터페이스), 사용자가 화면의 사물을 보고 클릭하면 컴퓨터가 해당 작업을 실행하여 해당 이벤트에 응답할 수 있습니다.

왜 터미널 사용에 신경을 써야 하나요?

우리는 대부분의 운영 체제가 GUI와 함께 제공된다고 언급했습니다. 따라서 화면에서 항목을 보고 원하는 작업을 수행하기 위해 주변을 클릭할 수 있다면 왜 이 복잡한 터미널/cli/쉘을 배워야 하는지 궁금할 것입니다.

첫 번째 이유는 많은 작업에서 더 효율적 . 잠시 후 몇 가지 예를 볼 수 있지만 GUI에서 다른 창을 여러 번 클릭해야 하는 작업이 많이 있습니다. 그러나 CLI에서는 이러한 작업을 단일 명령으로 실행할 수 있습니다.

이러한 의미에서 명령줄에 익숙해지면 시간을 절약하고 작업을 더 빨리 실행할 수 있습니다.

두 번째 이유는 명령을 사용하여 쉽게 작업을 자동화할 수 있기 때문입니다. . 이전에 언급했듯이 쉘을 사용하여 스크립트를 빌드하고 나중에 원할 때마다 해당 스크립트를 실행할 수 있습니다. 이것은 우리가 반복해서 하고 싶지 않은 반복적인 작업을 처리할 때 매우 유용합니다.

몇 가지 예를 들자면, 새로운 온라인 리포지토리를 생성하거나 클라우드 공급자에 특정 인프라를 생성하거나 매시간 화면 배경 화면을 변경하는 것과 같은 더 간단한 작업을 실행하는 스크립트를 작성할 수 있습니다.

스크립팅은 반복적인 작업으로 시간을 절약할 수 있는 좋은 방법입니다.

세 번째 이유는 때때로 CLI가 유일한 방법이 되기 때문입니다. 컴퓨터와 상호 작용할 수 있습니다. 예를 들어 클라우드 플랫폼 서버와 상호 작용해야 하는 경우를 생각해 보십시오. 대부분의 경우 GUI가 없고 명령을 실행하기 위한 CLI만 있습니다.

따라서 CLI에 익숙해지면 모든 경우에 컴퓨터와 상호 작용할 수 있습니다.

마지막 이유는 멋있고 재미있기 때문이다. 영화 해커가 컴퓨터 주위를 클릭하는 것을 보지 못했습니까?;)

다양한 종류의 쉘

터미널에서 실행할 수 있는 실제 명령에 대해 알아보기 전에 다양한 유형의 쉘을 인식하고 현재 실행 중인 쉘을 식별하는 방법이 중요하다고 생각합니다.

쉘마다 구문과 기능이 다르므로 입력할 명령을 정확히 알기 위해서는 먼저 실행 중인 쉘을 알아야 합니다.

약간의 역사 – Posix

쉘의 경우 Posix라는 공통 표준이 있습니다. .

Posix는 ECMAScript가 JavaScript에서 작동하는 것과 매우 유사한 방식으로 쉘에서 작동합니다. 모든 쉘이 준수해야 하는 특정 특성과 기능을 지시하는 표준입니다.

이 표준은 1980년대에 제정되었으며 대부분의 최신 쉘은 해당 표준에 따라 개발되었습니다. 이것이 대부분의 쉘이 유사한 구문과 유사한 기능을 공유하는 이유입니다.

실행 중인 쉘을 어떻게 알 수 있나요?

현재 실행 중인 쉘을 확인하려면 터미널을 열고 echo $0를 입력하세요. . 이것은 현재 실행 중인 프로그램 이름을 인쇄합니다. 이 경우 실제 쉘입니다.

초보자를 위한 명령줄 – 프로처럼 터미널을 사용하는 방법 [전체 핸드북]

어떤 쉘이 더 낫습니까?

대부분의 쉘 사이에는 큰 차이가 없습니다. 대부분이 동일한 표준을 준수하므로 대부분 비슷하게 작동합니다.

하지만 알고 싶은 약간의 차이점이 있습니다.

  • 언급한 바와 같이 배쉬 가장 널리 사용되며 Mac 및 Linux에 기본적으로 설치됩니다.
  • Bash와 매우 유사하지만 Bash 이후에 만들어졌으며 몇 가지 멋진 개선 사항이 제공됩니다. 차이점에 대해 더 자세히 알고 싶다면 여기에 대한 멋진 기사를 참조하세요.
  • 물고기 자동 완성 및 구문 강조 표시와 같은 몇 가지 훌륭한 내장 기능 및 구성과 함께 제공되는 일반적으로 사용되는 또 다른 셸입니다. Fish의 문제는 Bash와 Zsh가 있는 반면 Posix의 불만 사항이 아니라는 것입니다. 이것은 Bash 및 Zsh에서 실행할 수 있는 일부 명령이 Fish에서 실행되지 않으며 그 반대의 경우도 마찬가지임을 의미합니다. 이로 인해 Fish 스크립팅은 Bash 및 Zsh에 비해 대부분의 컴퓨터와 덜 호환됩니다.
  • 와 같은 다른 껍질도 있습니다. 또는 대시 (이름을 지정하면 모든 것이 더 혼란스러워집니다. 저는 알고 있습니다...) Posix 쉘의 제거된 버전입니다. 즉, Posix에 필요한 기능만 제공하고 다른 기능은 제공하지 않습니다. Bash와 Zsh가 더 많은 기능을 추가하는 동안 Posix가 요구하는 것보다.

쉘이 더 많은 기능을 추가한다는 사실은 쉘과 상호 작용하기가 더 쉽고 친숙하지만 스크립트와 명령을 실행하는 속도가 느립니다.

따라서 일반적인 방법은 Bash 또는 Zsh와 같은 "향상된" 셸을 일반적인 상호 작용에 사용하고 Ash 또는 Dash와 같은 "제거된" 셸을 사용하여 스크립트를 실행하는 것입니다.

나중에 스크립팅을 할 때 주어진 스크립트를 실행할 쉘을 정의하는 방법을 알게 될 것입니다.

이러한 셸을 더 자세히 비교하고 싶다면 다음 동영상을 참조하세요.

쉘을 추천해야 한다면 가장 표준적이고 일반적으로 사용되는 bash를 추천합니다. 즉, 지식을 대부분의 환경으로 번역할 수 있습니다.

그러나 다시, 진실은 대부분의 껍질 사이에 큰 차이가 없다는 것입니다. 따라서 어쨌든 몇 가지를 시도하고 가장 좋아하는 것을 볼 수 있습니다.;)

사용자 정의에 대한 의견

방금 Fish가 자동 완성 및 구문 강조와 같은 기본 제공 구성과 함께 제공된다고 언급했습니다. 이것은 Fish에 내장되어 있지만 Bash 또는 Zsh에서도 이러한 기능을 구성할 수 있습니다.

요점은 쉘을 사용자 정의할 수 있다는 것입니다. 프로그램 작동 방식, 사용 가능한 명령, 프롬프트에 표시되는 정보 등을 편집할 수 있습니다.

여기에서 사용자 정의 옵션을 자세히 볼 수는 없지만 컴퓨터에 셸을 설치할 때 특정 파일이 시스템에 생성된다는 것을 알고 있습니다. 나중에 해당 파일을 편집하여 프로그램을 사용자 정의할 수 있습니다.

또한 더 쉬운 방법으로 셸을 사용자 정의할 수 있는 많은 플러그인이 온라인에서 제공됩니다. 당신은 그들을 설치하고 플러그인이 제공하는 기능을 얻을. 몇 가지 예는 OhMyZsh 및 Starship입니다.

이러한 사용자 정의 옵션은 터미널에도 적용됩니다.

따라서 선택할 수 있는 셸 및 터미널 옵션이 많을 뿐만 아니라 각 셸 및 터미널에 대한 구성 옵션도 많습니다.

처음 시작하는 경우 이 모든 정보가 다소 압도적으로 느껴질 수 있습니다. 그러나 사용할 수 있는 옵션이 많이 있으며 각 옵션도 사용자 지정할 수 있습니다. 그게 다야.

사용할 가장 일반적이고 유용한 명령

이제 CLI 작동 방식에 대한 기초가 마련되었으므로 일상 작업에 사용할 수 있는 가장 유용한 명령을 살펴보겠습니다.

이 예제는 현재 구성(Linux OS의 Bash)을 기반으로 합니다. 그러나 대부분의 명령은 어쨌든 대부분의 구성에 적용되어야 합니다.

  • 에코 전달한 매개변수가 무엇이든 터미널에 인쇄합니다.
echo Hello freeCodeCamp! // Output: Hello freeCodeCamp!
  • 암호 인쇄 작업 디렉토리를 나타내며 컴퓨터에서 현재 있는 "장소" 또는 디렉토리를 인쇄합니다.
pwd // Output: /home/German
  • 현재 있는 디렉토리의 내용을 표시합니다. 현재 디렉토리에 포함된 파일과 기타 디렉토리를 모두 표시합니다.

예를 들어, 저는 최근에 작업한 React 프로젝트 디렉토리에 있습니다.

ls // Output:
node_modules  package.json  package-lock.json  public  README.md  src

이 명령을 플래그 또는 매개변수 -a로 전달하면 그것은 또한 당신에게 숨겨진 파일이나 디렉토리를 보여줄 것입니다. .git처럼 또는 .gitignore 파일

ls -a // Output:
.   .env  .gitignore    package.json       public     src
..  .git  node_modules  package-lock.json  README.md
  • CD 디렉토리 변경의 약자이며 현재 디렉토리에서 다른 디렉토리로 이동합니다.

내 홈 디렉토리에 있는 동안 cd Desktop을 입력할 수 있습니다. 데스크탑 디렉토리로 이동합니다.

현재 디렉토리가 포함된 디렉토리로 이동하려면 cd ..를 입력하면 됩니다.

cd를 입력하면 혼자서는 홈 디렉토리로 바로 이동합니다.

  • mkdir make 디렉토리를 나타내며 새 디렉토리를 생성합니다. 명령에 디렉토리 이름 매개변수를 전달해야 합니다.

"Test"라는 새 디렉토리를 만들려면 mkdir test를 입력합니다. .

  • rmdir 디렉토리 제거를 나타내며 바로 수행합니다. mkdir과 같은 디렉토리 이름 매개변수가 필요합니다. :rmdir test .

  • 터치 현재 디렉토리에 빈 파일을 생성할 수 있습니다. 매개변수로 touch test.txt와 같은 파일 이름을 사용합니다. .

  • RM rmdir과 같은 방식으로 파일을 삭제할 수 있습니다. 디렉토리를 제거할 수 있습니다.
    rm test.txt

  • cp 파일이나 디렉토리를 복사할 수 있습니다. 이 명령은 두 개의 매개변수를 사용합니다. 첫 번째 매개변수는 복사하려는 파일 또는 디렉토리이고 두 번째 매개변수는 복사 대상(파일/디렉토리를 복사할 위치)입니다.

동일한 디렉토리에 내 txt 파일의 사본을 만들고 싶다면 다음을 입력할 수 있습니다:

cp test.txt testCopy.txt

디렉토리가 변경되지 않는지 확인하십시오. "destination"에 대해 파일의 새 이름을 입력합니다.

파일을 다른 디렉토리에 복사하고 싶지만 동일한 파일 이름을 유지하려면 다음과 같이 입력하면 됩니다.

cp test.txt ./testFolder/

그리고 필드 이름을 변경하여 다른 폴더에 복사하려는 경우 물론 다음을 입력할 수 있습니다.

cp test.txt ./testFolder/testCopy.txt
  • 뮤비 move의 줄임말로 파일이나 디렉토리를 한 곳에서 다른 곳으로 이동할 수 있습니다. 즉, 새 디렉토리에 생성하고 이전 디렉토리에서 삭제합니다(잘라내기 및 붙여넣기로 수행할 수 있는 것과 동일).

다시 말하지만, 이 명령은 이동하려는 파일 또는 디렉터리와 대상이라는 두 개의 매개변수를 사용합니다.

mv test.txt ./testFolder/

원하는 경우 동일한 명령으로 파일 이름도 변경할 수 있습니다.

mv test.txt ./testFolder/testCopy.txt
  • 머리 터미널에서 직접 파일 또는 파이프된 데이터의 시작 부분을 볼 수 있습니다.
head test.txt // Output:
this is the beginning of my test file
  • 꼬리 동일하게 작동하지만 파일의 끝이 표시됩니다.
tail test.txt // Output:

this is the end of my test file
  • --도움 플래그는 대부분의 명령에 사용할 수 있으며 해당 명령을 사용하는 방법에 대한 정보를 반환합니다.
cd --help // output:
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.

현재 디렉토리를 DIR로 변경합니다. 기본 DIR은 HOME 쉘 변수의 값입니다.

변수 CDPATH는 DIR이 포함된 디렉토리의 검색 경로를 정의합니다. CDPATH의 대체 디렉토리 이름은 콜론 :으로 구분됩니다. .

DIR이 ...로 시작하는 경우 null 디렉토리 이름은 현재 디렉토리와 동일합니다. .

  • 비슷한 방식으로 남자 명령은 특정 명령에 대한 정보를 반환합니다.
    man cp // output:

    CP(1)                            User Commands                           CP(1)

    NAME
           cp - copy files and directories

    SYNOPSIS
           cp [OPTION]... [-T] SOURCE DEST
           cp [OPTION]... SOURCE... DIRECTORY
           cp [OPTION]... -t DIRECTORY SOURCE...

    DESCRIPTION
           Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

           Mandatory  arguments  to  long  options are mandatory for short options
           too.

           -a, --archive
                  same as -dR --preserve=all

           --attributes-only
                  don't copy the file data, just the attributes
    ...

man bash를 입력할 수도 있습니다. 그러면 이 셸에 대해 알아야 할 모든 것에 대한 방대한 설명서가 반환됩니다.;)

  • 코드 기본 코드 편집기가 열립니다. 명령만 입력하면 가장 최근에 연 파일/디렉토리가 있는 편집기만 열립니다.

매개변수로 전달하여 주어진 파일을 열 수도 있습니다:code test.txt .

또는 새 파일 이름을 전달하여 새 파일을 엽니다. code thisIsAJsFile.js .

  • 수정 기본 명령줄 텍스트 편집기(Mac 또는 Linux를 사용하는 경우 Nano 또는 Vim일 가능성이 높음)에서 텍스트 파일을 엽니다.

파일을 연 다음 편집기를 종료할 수 없는 경우 먼저 다음 밈을 살펴보세요.

![vimExit](https://www.freecodecamp.org/news/content/images/2022/03/vimExit.png)

그런 다음 :q!를 입력합니다. Enter 키를 누릅니다.

대부분의 작업(편집기 종료 등)이 키보드 단축키로 수행되기 때문에 모든 사람이 처음에는 CLI 텍스트 편집기로 어려움을 겪기 때문에 밈이 재미있습니다. 이 편집기를 사용하는 것은 완전히 다른 주제이므로 더 배우고 싶다면 튜토리얼을 찾아보십시오.;)

  • ctrl+c 터미널이 실행 중인 현재 프로세스를 종료할 수 있습니다. 예를 들어 npx create-react-app를 사용하여 반응 앱을 만드는 경우 어느 시점에서 빌드를 취소하려면 ctrl+c를 누르세요. 그러면 중지됩니다.

  • 터미널에서 텍스트 복사는 ctrl+shift+c로 수행할 수 있습니다. ctrl+shift+v로 붙여넣기 가능

  • 맑음 모든 이전 콘텐츠에서 터미널을 지웁니다.

  • 종료 터미널을 닫고 (명령은 아니지만 이것도 좋습니다) ctrl+alt+t 새 터미널이 열립니다.

  • 위쪽 및 아래쪽 키를 눌러 이전에 입력한 명령을 탐색할 수 있습니다.

  • 을 누르면 지금까지 작성한 텍스트를 기반으로 자동 완성이 표시됩니다. 탭을 두 번 누르면 지금까지 작성한 텍스트를 기반으로 제안을 받게 됩니다.

예를 들어 edit test를 작성하면 두 번 탭 , testFolder/ test.txt를 얻습니다. . edit test.를 작성하면 을 누르세요. 내 텍스트가 자동 완성되어 edit test.txt

Git 명령

파일 시스템에서 작업하고 설치/제거하는 것 외에도 Git 및 온라인 저장소와 상호 작용하는 것은 아마도 개발자로서 터미널을 사용하게 될 가장 일반적인 작업일 것입니다.

주변을 클릭하는 것보다 터미널에서 수행하는 것이 훨씬 더 효율적이므로 가장 유용한 git 명령을 살펴보겠습니다.

  • git 초기화 새 로컬 저장소를 생성합니다.
git init // output:
Initialized empty Git repository in /home/German/Desktop/testFolder/.git/
  • git add 하나 이상의 파일을 스테이징에 추가합니다. 스테이징에 추가할 특정 파일을 자세히 설명하거나 git add .를 입력하여 변경된 모든 파일을 추가할 수 있습니다.

  • git 커밋 변경 사항을 저장소에 커밋합니다. 커밋은 항상 -m를 동반해야 합니다. 플래그 및 커밋 메시지.

git commit -m 'This is a test commit' // output:
[master (root-commit) 6101dfe] This is a test commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.js
  • git 상태 현재 어떤 브랜치에 있는지, 커밋할 변경 사항이 있는지 여부를 알려줍니다.
git status  // output:
On branch master
nothing to commit, working tree clean
  • git 클론 현재 있는 디렉터리로 저장소를 복제(복사)할 수 있습니다. 원격 저장소(Github, GitLab 등)와 로컬 저장소(컴퓨터에 저장된 저장소)를 모두 복제할 수 있습니다.
git clone https://github.com/coccagerman/MazeGenerator.git // output:
Cloning into 'MazeGenerator'...
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 15 (delta 1), reused 11 (delta 0), pack-reused 0
Unpacking objects: 100% (15/15), done.
  • git remote add origin 프로젝트에 사용할 원격 저장소의 URL을 자세히 설명하는 데 사용됩니다. 특정 시점에서 변경하려는 경우 git remote set-url origin 명령을 사용하여 변경할 수 있습니다. .
git remote add origin https://github.com/coccagerman/testRepo.git
<블록 인용>

URL을 가져오려면 먼저 원격 저장소를 만들어야 합니다. 나중에 약간의 스크립트를 사용하여 명령줄에서 이 작업을 수행하는 방법을 살펴보겠습니다.;)

  • git 원격 -v 현재 사용 중인 원격 저장소를 나열할 수 있습니다.
git remote -v // output:
origin	https://github.com/coccagerman/testRepo.git (fetch)
origin	https://github.com/coccagerman/testRepo.git (push)
  • git 푸시 커밋된 변경 사항을 원격 저장소에 업로드합니다.
git push // output:
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 266 bytes | 266.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
  • git 분기 리포지토리에서 사용 가능한 모든 분기를 나열하고 현재 어떤 분기에 있는지 알려줍니다. 새 브랜치를 생성하려면 git branch <branch name>과 같은 매개변수로 새 브랜치 이름을 추가하면 됩니다. .
git branch // output:
* main
  • git 체크아웃 한 지점에서 다른 지점으로 이동합니다. 대상 분기를 매개변수로 사용합니다.
git checkout newBranch // output:
Switched to branch 'newBranch'
  • git pull 원격 저장소에서 코드를 가져오고(다운로드) 로컬 저장소와 결합합니다. 이는 많은 개발자가 동일한 코드 기반에서 작업할 때 팀으로 작업할 때 특히 유용합니다. 이 경우 각 개발자는 다른 모든 개발자가 수행한 변경 사항을 포함하는 코드 기반에서 작업하기 위해 원격 저장소에서 주기적으로 가져옵니다.

원격 리포지토리에 새 코드가 있는 경우 명령은 풀에서 수정된 실제 파일을 반환합니다. 그렇지 않은 경우 Already up to date를 얻습니다. .

git pull // output:
Already up to date.
  • git diff 현재 있는 지점과 다른 지점 간의 차이점을 볼 수 있습니다.
git diff newBranch // output:
diff --git a/newFileInNewBranch.js b/newFileInNewBranch.js
deleted file mode 100644
index e69de29..0000000

부수적으로, 브랜치나 리포지토리 간의 차이점을 비교할 때 일반적으로 Meld와 같은 시각적 도구가 사용됩니다. 터미널에서 직접 시각화할 수 없는 것은 아니지만 이 도구는 더 명확한 시각화를 위해 좋습니다.

  • git 병합 현재 있는 분기를 다른 분기와 병합(결합)합니다. 변경 사항은 현재 있는 지점에만 통합되며 다른 지점에는 통합되지 않습니다.
git merge newBranch // output:
Updating f15cf51..3a3d62f
Fast-forward
 newFileInNewBranch.js | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 newFileInNewBranch.js
  • git 로그 저장소에서 수행한 모든 이전 커밋을 나열합니다.
git log // output:
commit 3a3d62fe7cea7c09403c048e971a5172459d0948 (HEAD -> main, tag: TestTag, origin/main, newBranch)
Author: German Cocca <german.cocca@avature.net>
Date:   Fri Apr 1 18:48:20 2022 -0300

    Added new file

commit f15cf515dd3ec398210108dce092debf26ff9e12
Author: German Cocca <german.cocca@avature.net>
    ...
  • --도움 플래그는 bash에서 작동하는 것과 똑같은 방식으로 주어진 명령에 대한 정보를 표시합니다.
git diff --help // output:
GIT-DIFF(1)                       Git Manual                       GIT-DIFF(1)

NAME
       git-diff - Show changes between commits, commit and working tree, etc

SYNOPSIS
       git diff [options] [<commit>] [--] [<path>...]
       git diff [options] --cached [<commit>] [--] [<path>...]
       ...

첫 번째 스크립트

이제 명령줄의 정말 재미있고 멋진 부분인 스크립팅으로 이동할 준비가 되었습니다!

앞서 언급했듯이 스크립트는 주어진 시간에 실행할 수 있는 일련의 명령이나 지침에 불과합니다. 코드를 작성하는 방법을 설명하기 위해 단일 명령을 실행하여 github 리포지토리를 만들 수 있는 간단한 예제를 사용합니다.;)

  • 가장 먼저 할 일은 .sh를 생성하는 것입니다. 파일. 원하는 곳에 놓을 수 있습니다. 내 newGhRepo.sh를 호출했습니다. .

  • 그런 다음 선택한 텍스트/코드 편집기에서 엽니다.

  • 첫 번째 줄에 다음을 작성합니다. #! /bin/sh

이것을 쉬뱅이라고 합니다. , 그리고 그 기능은 이 스크립트를 실행할 쉘을 선언하는 것입니다.

이전에 일반적인 상호 작용을 위해 주어진 쉘을 사용하고 스크립트를 실행하기 위해 다른 주어진 쉘을 사용할 수 있다고 언급했던 것을 기억하십니까? 글쎄, shebang은 스크립트를 실행하는 쉘을 지시하는 명령입니다.

또한 언급했듯이 "제거된" 셸(sh 셸이라고도 함)을 사용하여 스크립트를 실행하는 것이 더 효율적입니다. 내 컴퓨터에는 dash 셸이 있습니다.

이 스크립트가 bash와 함께 실행되기를 원한다면 shebang은 #! /bin/bash

  • 다음 줄은 repoName=$1입니다.

여기에서 변수를 선언합니다. repoName을 호출하고 스크립트가 수신하는 첫 번째 매개변수의 값에 할당합니다.

매개변수 스크립트/명령 뒤에 입력되는 문자 집합입니다. cd와 같이 명령에서 디렉토리를 변경하려면 디렉토리 매개변수를 지정해야 합니다(예:cd testFolder ).

스크립트 내에서 매개변수를 식별할 수 있는 방법은 달러 기호와 해당 매개변수가 필요한 순서를 사용하는 것입니다.

하나 이상의 매개변수가 필요하면 다음과 같이 작성할 수 있습니다.

paramOne=$1
paramTwo=$2
paramThree=$3
...
  • 그래서 우리는 스크립트의 매개변수로 저장소 이름을 기대하고 있습니다. 그러나 사용자가 입력하는 것을 잊어버리면 어떻게 됩니까? 이에 대한 계획이 필요하므로 다음에는 조건부 해당 매개변수가 수신될 때까지 사용자에게 리포지토리 이름을 입력하도록 계속 요청합니다.

다음과 같이 할 수 있습니다.

while [ -z "$repoName" ]
do
   echo 'Provide a repository name'
   read -r -p $'Repository name:' repoName
done

여기서 하는 일은 다음과 같습니다.

  1. repoName 변수가 할당되지 않은 동안(while [ -z "$repoName" ] )
  2. 이 메시지를 콘솔에 기록합니다(echo 'Provide a repository name' )
  3. 그런 다음 사용자가 제공하는 모든 입력을 읽고 repoName 변수에 입력을 할당합니다(read -r -p $'Repository name:' repoName )
  • 이제 리포지토리 이름이 지정되었으므로 다음과 같이 로컬 Git 리포지토리를 만들 수 있습니다.
echo "# $repoName" >> README.md
git init
git add .
git commit -m "First commit"

이것은 readme 파일을 만들고 repo 이름(echo "# $repoName" >> README.md)으로 한 줄을 쓰는 것입니다. ) 그런 다음 git repo를 초기화하고 첫 번째 커밋을 수행합니다.

  • 그런 다음 저장소를 github에 업로드할 차례입니다. 이를 위해 다음 명령에서 github API를 활용할 것입니다.

curl -u coccagerman https://api.github.com/user/repos -d '{"name": "'"$repoName"'", "private":false}'

지원되는 많은 프로토콜 중 하나를 사용하여 서버에서 또는 서버로 데이터를 전송하는 명령입니다.

다음으로 -u를 사용합니다. 리포지토리를 생성할 사용자를 선언하는 플래그(-u coccagerman ).

다음은 GitHub API(https://api.github.com/user/repos)에서 제공하는 엔드포인트입니다. )

마지막으로 -d를 사용하고 있습니다. 플래그를 사용하여 이 명령에 매개변수를 전달합니다. 이 경우 저장소 이름을 나타냅니다(여기에 대해 repoName 변수) 및 private 설정 false 옵션 , 리포지토리가 공개되기를 원하기 때문입니다.

API에서 다른 많은 구성 옵션을 사용할 수 있으므로 자세한 내용은 문서를 확인하세요.

  • 이 명령을 실행하면 GitHub에서 비공개 토큰을 입력하라는 메시지를 표시합니다. 인증을 위해.

비공개 토큰이 아직 없는 경우 GitHub의 설정> 개발자 설정> 개인 액세스 토큰에서 생성할 수 있습니다.

초보자를 위한 명령줄 – 프로처럼 터미널을 사용하는 방법 [전체 핸드북]

초보자를 위한 명령줄 – 프로처럼 터미널을 사용하는 방법 [전체 핸드북]

초보자를 위한 명령줄 – 프로처럼 터미널을 사용하는 방법 [전체 핸드북]

  • 좋아요, 이제 거의 끝났습니다! 지금 필요한 것은 원격 URL입니다. 새로 생성된 GitHub 리포지토리

다음과 같이 curl과 GitHub API를 다시 사용하게 하려면:

GIT_URL=$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/coccagerman/"$repoName" | jq -r '.clone_url')

Here we're declaring a variable called GIT_URL and assigning it to whatever the following command returns.

The -H flag sets the header of our request.

Then we pass the GitHub API endpoint, which should contain our user name and repo name (https://api.github.com/repos/coccagerman/"$repoName" ).

Then we're piping the return value of our request. Piping just means passing the return value of a process as the input value of another process. We can do it with the | symbol like <process1> | <process2> .

And finally we run the jq command, which is a tool for processing JSON inputs. Here we tell it to get the value of .clone_url which is where our remote git URL will be according to the data format provided by the GitHub API.

  • And as last step, we rename our master branch to main, add the remote origin we just obtained, and push our code to GitHub! =D
git branch -M main
git remote add origin $GIT_URL
git push -u origin main

Our full script should look something like this:

#! /bin/sh
repoName=$1

while [ -z "$repoName" ]
do
    echo 'Provide a repository name'
    read -r -p $'Repository name:' repoName
done

echo "# $repoName" >> README.md
git init
git add .
git commit -m "First commit"

curl -u <yourUserName> https://api.github.com/user/repos -d '{"name": "'"$repoName"'", "private":false}'

GIT_URL=$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/<yourUserName>/"$repoName" | jq -r '.clone_url')

git branch -M main
git remote add origin $GIT_URL
git push -u origin main
  • Now it's time to test our script! To execute it there're two things we can do.

One option is to enter the shell name and pass the file as parameter, like:dash ../ger/code/projects/scripts/newGhRepo.sh .

And the other is to make the file executable by running chmod u+x ../ger/code/projects/scripts/newGhRepo.sh .

Then you can just execute the file directly by running ../ger/code/projects/scripts/newGhRepo.sh .

And that's it! We have our script up and running. Everytime we need a new repo we can just execute this script from whatever directory we're in.

But there's something a bit annoying about this. We need to remember the exact route of the script directory. Wouldn't it be cool to execute the script with a single command that it's always the same independently of what directory we're at?

In come bash aliases to solve our problem.

Aliases are a way bash provides for making names for exact commands we want to run.

To create a new alias, we need to edit the bash configuration files in our system. This files are normally located in the home directory. Aliases can be defined in different files (mainly .bashrc or .bash_aliases ).

I have a .bash_aliases file on my system, so let's edit that.

  • In our CLI we enter cd to go over home directory.

  • Then we can enter ls -a to list all files (includen hidden ones) and check if we have either a .bashrc or .bash_aliases file in our system.

  • We open the file with our text/code editor of choice.

  • And we write our new alias like this:
    alias newghrepo="dash /home/German/Desktop/ger/code/projects/scripts/newGhRepo.sh"

Here I'm declaring the alias name, the actual command I'm going to enter to run the script (newghrepo ).

And between quotes, define what that alias is going to do ("dash /home/German/Desktop/ger/code/projects/scripts/newGhRepo.sh" )

See that I'm passing the absolute path of the script, so that this command works the same no matter what my current directory is.

If you don't know what the absolute path of your script is, go to the script directory on your terminal and enter readlink -f newGhRepo.sh . That should return the full path for you.;)

  • After we're done editing, we save our file, restart our terminal, and voilà! Now we can run our script by just entering newghrepo , no matter in what directory we currently are. Much quicker than opening the browser and clicking around to create our repo! =D

I hope this gives you a little taste of the kind of optimizations that are possible with scripting. It certainly requires a bit more work the first time you write, test, and set up the script. But after that, you'll never have to perform that task manually again.;)

Round up

The terminal can feel like an intimidating and intricate place when you're starting out. But it's certainly worth it to put time and effort into learning the ins and outs of it. The efficiency benefits are too good to pass up!

If you're interested in learning more about the terminal and Bash, Zach Gollwitzer has an awesome crash course series on youtube.
He has also great tutorials on other topics such as Node and Javascript, so I recommend that you follow him.;)

As always, I hope you enjoyed the article and learned something new. If you want, you can also follow me on linkedin or twitter.

Cheers and see you in the next one! =D

초보자를 위한 명령줄 – 프로처럼 터미널을 사용하는 방법 [전체 핸드북]