환경변수
환경변수 : 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임

export 를 통해 환경변수를 설정할 수 있으며 $export urclass="isgood" 와 같이 등록 할 수 있다. 다만, =(등호표시)앞뒤에 공백이 있으면 오류가 나므로 반드시 없어야 한다.
echo 와 함께 환경변수를 입력하면 환경변수의 값을 확인 할 수 있으며 이때 $(달라사인)을 입력하여, 변수라는 뜻을 터미널에 전달합니다.

dotenv
dotenv : 계정의 아이디나 비밀번호 등 기밀 정보를 그대로 코드에 작성하는 행동은 보안적으로 위험하기 때문에 기존의 기능을 유지하면서, 정보들을 공유하지 않도록 할 수 있으며 .env 파일을 환경변수로 사용할 수 있도록 돕는다.
- 설치법
mkdir environment_variable
cd environment_variable
npm init # 엔터 키를 여러번 입력해 init을 마칩니다.
npm i dotenv # dotenv 모듈을 설치합니다.
이때, 생성된 폴더는 설치할 모듈과 이름이 같아서는 안된다.
새로운 파일 index.js를 생성하고 process.env를 출력한다. console.log(process.env)
Node.js의 내장 객체 process.env를 이용하면 아래와 같이 나온다.
.env: Node.js에서 환경변수 영구 적용
export 로 적용한 환경변수는 현재 사용 중인 터미널에서만 임시로 사용이 가능하며 환경변수를 Linux 운영체제에 저장하는 방법은 여러 가지가 있지만, Node.js에서는 파일 .env를 만들어 저장하는 방법을 사용한다. Node.js에서는 프로젝트 디렉토리에 .env라는 이름의 파일이 존재하면 환경변수처럼 소스코드로 가져와서 사용할 수 있다.

먼저 .env 파일을 생성 후 환경변수로 활용할 myname에 kimcoding이라는 값을 할당한다.
그후 index.js 파일을 아래와 같이 수정하고 저장한다.
const dotenv = require("dotenv");
dotenv.config();
console.log(process.env.myname);
그 다음 index.js를 실행하면 kimcoding이라는 결과를 얻을 수 있다.
이와 같은 환경변수를 사용해서 API key, DB password와 같이 민감한 정보를 저장하고 관리할 수 있습니다. 그뿐만 아니라 서로 다른 PC 또는 여러 .env 파일에서, 같은 변수 이름에 다른 값을 할당할 수 있습니다. 실제 제품(서비스)을 개발하는 과정에는 개발 환경(local 또는 development 등)과 테스트 서버의 환경(test), 그리고 실제 제품을 제공하는 환경(production)이 있습니다. 예를 들어 구글 API를 이용해 웹 애플리케이션을 만드는 경우, 개발 환경에서는 개발자 개인의 API 키를 이용할 수 있습니다. 그러나 제품을 서비스할 때에 개인 API 키를 사용하면, 일일 요청량을 초과하는 경우 제품이 정상적인 동작을 할 수 없습니다. 이런 경우를 방지하기 위해 실제 제품에서는 기업용 API 키를 사용합니다. 이처럼 개발 환경과 제품을 제공하는 환경에서 사용하는 API 키가 다른 경우, 환경변수를 이용해 환경을 구분하여 코드를 작성할 수 있습니다. 데이터베이스도 마찬가지로 개발, 테스트, 제품 환경으로 구분할 수 있습니다. 다음 그림은 각기 다른 환경에, 같은 변수 이름을 사용하여 데이터베이스를 구분한 예시입니다.

쉘(Shell)
쉘(Shell)은 운영체제의 기능이나 서비스를 구현할 수 있는 명령어를 사용자에게 받아서 실행할 수 있는 인터페이스를 제공합니다. 사용자의 명령어를 실행해주는 프로그램 즉, 사용자와 운영체제의 다리 역할이자 명령어 처리기이다. 쉘의 기본적인 확장명은 sh이다.
1. Bourne Shell (sh)
- Bourne Shell 은 1974년 'Stephen Bourne' (스티브 본) 이 개발하였고, 최초의 쉘(Shell) 이다. 대부분의 리눅스에 기본적으로 설치가 되어있다. 설치 위치는 '/bin/sh' 이다.
2. C Shell (csh)
- C Shell 은 1978년 'Bill Joy' (빌 조이) 가 개발한 쉘(Shell) 이다. C Shell 은 Bourne Shell 의 사용성을 높이고, 더욱 한 층 강력하게 만들어졌다. C Shell 은 이름에서 보이다시피 C 언어를 기반으로 만든 Shell 이다. 때문에 강력한 프 로그램 작성 기능을 지니었다. 설치 위치는 '/bin/csh' 이다.
3. tee-see-Shell (tcsh)
- tee-see-Shell 은 'Carnegie Mellon University' (카네기 멜런 대학교) 의 학생들이 개발하여 1983년. 소스코드를 게시하였다. 간단하게 설명하면 C Shell 에서 명령 행 완성과 명령 행 편집 기능을 추가한 것이다. 초기 맥 OS X 는 tcsh를 기본 셸로 포함하고 있었다. (하지만 배시 쉘에 밀려버렸다.) 설치 위치는 '/bin/tcsh' 이다.
4. Z Shell (zsh)
- Z Shell 은 'Paul Falstad' (폴 폴스타드) 가 1990년 대학교에 재학 중 일 때 첫 버전을 작성하였다. Z Shell 은 지금까지의 수 많은 쉘(Shell) 들의 기능을 머금고 있다. 그렇기 때문에 많은 개선 사항들이 갖추어진 확장형 Bourne Shell 이다. 설치 위치는 '/bin/zsh' 이다.
5. Bourne-again shell (bash)
- Bourne-again shell 은 지금 현 시대에 가장 많이 쓰이는 Shell 이라고 생각한다. 줄여서 Bash Shell 은 GNU 프로젝트를 위해 'Brian Fox' (브라이언 폭스) 가 작성한 쉘(Shell) 이다. GNU 운영체제와 리눅스, 맥 OS 등 기본 쉘로 채택 되어있다. (사실상 모든 리눅스가 기본으로 Bash Sehll 만을 사용한다...) C Shell 과 Bourne Shell 의 기능들이 많이 포함 되어 있다. 대부분 Shell Script 라고 검색을 하면 기준이 십중팔구는 Bash Shell 로 작성 되어 있다. 그만큼 자료가 방대면서 배우기 쉽고, 강력하다는 증거이다. 설치 위치는 '/bin/bash' 이다.
다양한 쉘이 있지만 리눅스에선 bash쉘을 표준으로 사용하기 때문에, 우리는 bash쉘만 알아도 충분하다.

macOS 버전 10.15 인 ‘카탈리나’ 부터 기본 쉘 (Shell) 이 bash1 에서 zsh (Z shell)2 로 변경 되었습니다. 3일단 쉘을 변경한 이유를 애플에서 직접 밝히진 않았지만, The Verge 라는 언론에서는 bash 쉘의 라이센스와 연관된 것으로 추측하고 있습니다.
bash 스크립트
기초
- # : 쉘에서 완전 무시되는 특수기호, 주석으로 쓰인다. 하지만, #! 로 시작하면 예외(#!/bin/sh :스크립트 파일의 실행을 bash쉘로 한다는 의미)
- ehco : 인수로 전달되는 텍스트 / 문자열을 표시하는 데 사용하며 쉘 스크립트와 배치 파일에서 주로 현재 상태를 화면이나 파일로 출력하는데 사용되는 내장 명령어
#!/bin/sh
echo "Hello, World!"
test.sh라는 파일을 만들어 위에 값을 입력한 후 chmod 755 test.sh 후 ./test.sh 를 입력하면 Hello, World!가 출력되는 것을 볼 수 있다.
chmod 755 test.sh : 권한 부여
./test.sh: 실행

변수
변수의 이름으로써 영문자, 숫자 그리고 언더바가 사용되며, 값을 전달할 때는 = 의 앞,뒤에 공백 없이 작성한다. 문자열인 경우 "(쌍따옴표)로 감싼다. 변수에 액세스할 때 변수명의 앞에 $를 넣거나 $넣어서 변수를 {}로 감싼다. 하나의 변수에 한 개의 값만 보존된다.변수의 값이 덮어 쓰기되는 것을 방지하기 위해서는 readonly를 사용한다. 변수를 unset으로 삭제할 수 있다 (그러나 readonly변수를 삭제하는 것을 불가능하다).


#!/bin/sh
MY_MESSAGE="Hello, World!"
echo $MY_MESSAGE
MY_MESSAGE 라는 변수에 "Hello, World!" 라는 문자열을 넣었다. 이때 =앞뒤에는 공백이 반드시 없어야한다.
$ 기호를 입력하여, 변수라는 뜻을 터미널에 전달 할 수 있다.
반복문
반복문은 일련의 명령을 반복할 수 있도록 하는 프로그래밍 도구이다.
- While : 조건이 일치할 때 반복한다.
- Until : While과 반대로 조건이 일치하지않으면 반복한다.
- For : 리스트에 저장된 명령이 실행될 때까지 반복한다.
if 조건문
if조건은 주어진 조건에 따라서 에플리케이션을 다르게 동작하도록 하는 것이다.
if의 기본 작성법은 if [ 조건 ] then 커맨드 fi이며 if 와 fi는 한쌍이며 명령어 read로 입력을 받는다.


-
관리자 권한
* 주의하세요! 관리자 영역을 실수로 변경하면, 운영체제(Operating System)이 먹통이될 수 있습니다*
*운영체제가 망가지면, 운영체제를 재설치해야할 수 있습니다*
관리자(root) 권한
권리자 권한 : 사용자 또는 타사 프로그램이 시스템 파일을 변경/삭제하려는 시도로부터 시스템을 보호하는 보안 기능입니다.


whoami를 통해 확인할 수 있는 사용자는, 폴더의 형태로 존재하며 운영체제에 등록된 사용자를 확인하기위해, 하위 폴더(Ubuntu: home/, macOS: Users/)로 이동합니다. 명령어 ls를 이용해 폴더나 파일을 확인하면, [username]의 폴더를 확인할 수 있습니다.

사용자 권한은 username 폴더 내에서만 자유롭게 사용할 수 있으며 관리자 권한을 이용하면, 다른 사용자 폴더에도 영향을 끼칠 수 있습니다. 물론 시스템 자체에도 접근이 가능하며 관리자 권한으로 변경한 내용은 사용자 권한으로 해결 할 수가 없다.
* 사용자 폴더의 경로(Path)는 ~/로 표시됩니다. 물결기호(~)는 루트폴더(/)로부터 사용자 폴더(username)까지의 경로를 축약한 형태입니다.
sudo: 관리자 권한을 획득하는 명령어
sudo : 관리자 권한을 획득하는 명령어이다. sudo mkdir [폴더명] 로 관리자 소유의 폴더를 생성 할 수 있다.

폴더명 linux와 파일명 helloworld.js열 맨 앞을 보면 linux는 drwxr-xr-x, helloworld.js는 -rwx------를 확인 할 수 있다.
- d는 directory이다
- -은 not " 이다.
- r은 read permisson 이다.
- w는 write permisson 이다.
- x는 execute permisoon 이다.
- l은 link이다

user, group, and other
user:
- user는 파일의 소유자(owner)입니다. 기본적으로 파일을 만든 사람이 소유자가 됩니다. 따라서 user를 소유자라고 하기도 합니다.
group:
- group에는 여러 user가 포함될 수 있습니다. 그룹에 속한 모든 user는 파일에 대한 동일한 group 액세스 권한을 갖습니다. 많은 사람이 파일에 액세스해야 하는 프로젝트가 있다고 가정합니다. 각 user에게 일일이 권한을 할당하는 대신에 모든 user를 group에 추가하고, 파일에 group 권한을 할당할 수 있습니다.
other:
- 파일에 대한 액세스 권한이 있는 다른 user입니다. 파일을 만들지 않은 다른 모든 user를 의미합니다. 따라서 other 권한을 설정하면, 해당 권한을 global 권한 설정이라고 볼 수도 있습니다.
chmod: 권한을 변경하는 명령어
chmod : 폴더나 파일의 읽기, 쓰기, 실행 권한을 변경 할 수 있는 명령어다. OS에 로그인한 사용자와, 폴더나 파일의 소유자가 같을 경우에 명령어 chmod 로 폴더나 파일의 권한을 변경할 수 있습니다. 만약 OS에 로그인한 사용자와, 폴더나 파일의 소유자가 다를 경우에는 관리자 권한을 획득하는 명령어 sudo 를 이용해 폴더나 파일의 권한을 변경할 수 있으며 변경 방법에는 두가지 방식이 있다.
- 더하기(+), 빼기(-), 할당(=)과 액세서 유형을 표기해서 변경하는 Symbolic method입니다.
- rwx를 3 bit로 해석하여, 숫자 3자리로 권한을 표기해서 변경하는 Absolute form입니다.
Symbolic method
| 액세스 클래스 | 연산자 | 액세스 타입 |
| u (user) | + (add access) | r (read) |
| g (group) | - (remove access) | w (write) |
| o (other) | = (set exact access) | x (execute) |
| a (all: u, g, and o) |
chmod 명령어와 symbolic method로 helloworld.js 파일의 권한을 변경 할 수 있다.


Absolute form
| 권한 | 숫자 |
| Read (r) | 4 |
| Write (w) | 2 |
| Execute (x) | 1 |
만약, user는 rwx 를, group과 other은 r-- 로 권한을 변경하고자 한다면, 위 표의 숫자의 합을 user, group, other 순으로 입력하면 된다. r+w+x = 4+2+1 = 7 이며, r + "- " + "-" = 4+ "-" + "-" = 4 이므로 u=7, g, o = 4 -> 744가 된다.
chmod 744 helloworld.js로 변경 가능하다.


Absolute form 의 숫자별 권한
| # | sum | rwx | permission |
| 7 | 4(r) + 2(w) + 1(x) | rwx | read, write and execute |
| 6 | 4(r) + 2(w) + 0(-) | rw- | read and write |
| 5 | 4(r) + 0(-) + 1(x) | r-x | read and execute |
| 4 | 4(r) + 0(-) + 0(-) | r-- | read only |
| 3 | 0(-) + 2(w) + 1(x) | -wx | write and execute |
| 2 | 0(-) + 2(w) + 0(-) | -w- | write only |
| 1 | 0(-) + 0(-) + 1(x) | --x | execute only |
| 0 | 0(-) + 0(-) + 0(-) | --- | none |