<Linux Shell Script Chapter 7> - 입출력과 환경변수 2

심우열·2023년 2월 28일
0

Linux Shell Script

목록 보기
17/17

4. 변수의 범위(스코프)

쉘 변수는 기본적으로 전역변수임

1. 함수

1. 함수 외부에서 선언된 변수

year=2023
function sub(){ echo year=${year} in function; }
sub

2. 함수 내부에서 재 초기화 된 변수

year=2023
function sub(){ echo year=${year} in function; year=4050;}
sub
echo year=${year} in outer

2. 스크립트

1. 스크립트 외부에서 생성된 변수

echo 'echo year=$year' > mydate.sh
chmod +x mydate.sh
./mydate.sh
echo year=$year in outer

2. 스크립트 내부에서 재 초기화 된 변수

  1. mydate.sh
#!/bin/bash
echo year=$year
year=9999
  1. 스크립트 외부에서 확인
./mydate.sh
echo year=$year in outer

스크립트는 외부에서 생생된 일반변수에 접근할 수 없음

쉘 스크립트는 기본적으로 변수에 관한 한 SandBox 로 이해하면 됨

3. 서브쉘

1. 서브쉘 바깥에서 선언된 변수가 서브쉘 내에서 접근 되는지 확인

year=2023
( echo year=${year} in inline; year=4050; )
echo year=${year} in outer

서브쉘에서는 일반 변수를 상속 받아 사용이 가능함

하지만, 서브쉘 외부에는 영향을 미치지 못함

따라서 서브쉘은 기본적으로 변수를 복제하여 사용한다고 이해하면 됨

4. 인라인 그룹

  1. 외부에서 선언된 변수가 인라인 그룹 내에서 접근-변경 될 수 있는지 확인
year=2023
{ echo year=${year} in inline; year=4050; };
echo year=${year} in outer

외부에서 선언된 변수는 인라인 그룹 내에서 접근-변경 가능

인라인 그룹은 기본적으로 명령어를 묶어놓은 것 뿐이기 때문

5. export 한 변수

export year=2020
./mydate.sh
echo year=$year in outer

mydate.sh

#!/bin/bash
echo year=$year
year=9999

쉘 스크립트는 export 된 변수도 영향을 미치지 못함

5. 파일 디스크립터

1. 파일 디스크립터란?

  1. 파일 디스크립터(FD: File Descrptor) 는 프로그램이 파일을 참조하는 방식
  2. 또는 파일(파이프, 장치, 소켓 또는 터미널)처럼 작동하는 다른 리소스를 참조하는 방법
  3. 데이터 소스에 대한 포인터와 비슷하거나, 혹은 기록 가능한 장소 같은 것
  4. FD에서 읽거나 쓸 때, FD의 리소스에서 데이터를 읽거나 쓰게 됨

2. 프로세스가 갖는 기본적인 파일 디스크립터

  1. 표준 입력(stdin): 파일 디스크립터 0
  2. 표준 출력(stdout): 파일 디스크립터 1
  3. 표준 오류(stderr): 파일 디스크립터 2

6. 리다이렉션

1. 리다이렉션이란?

  1. 표준 출력 내용을 파일로 저장
  2. 파일의 내용을 방향을 바꾸어 다른 파일로 전달

2. 표준 출력 전달(>, 1>)

echo "The seagull that flies the highest sees the farthest" > seagull.txt
cat seagull.txt

또는 파일 디스크립터 1(stdout)을 붙여 다음과 같이 표현 가능

echo "The seagull that flies the highest sees the farthest" 1> seagull.txt
cat seagull.txt

3. 표준 에러 전달(2>)

ls dir333
ls dir333 2> err.log
cat err.log

4. 표준 입력 전달(0<)

while read v; do echo $v; done  0< file

5. 전달 내용 추가(>>)

ls dir4444
ls dir4444 2>> err.log
cat err.log

'>'가 한개만 쓰일경우, 추가가 아닌 덮어쓰기로 작동

6. 두개의 내용 병합하기

echo ABCD > file1
echo 1234 > file2
cat file1 file2 > file
cat file

profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

0개의 댓글