일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 한번에끝내는JavaSpring웹개발마스터초격차패키지Online
- String
- 직장인자기계발
- 재택근무
- 직장인인강
- ncs
- DesignPattern
- 국비
- 자바기초
- 자바연습문제
- 패캠챌린지
- 웹
- 디자인
- 디자인패턴
- 자바기본
- 데이터베이스
- java
- DB
- 리눅스
- java기초
- 한번에끝내는JavaSpring웹개발마스터초격차패키지Online강의
- 자바예제
- 패스트캠퍼스후기
- 스프링
- 패스트캠퍼스
- linux
- 자바
- js
- Spring
- javabasic
- Today
- Total
FIF's 코딩팩토리
리눅스 BASH Shell 프로그래밍 기초(1) 본문
요즘 리눅스 BASH프로그래밍을 공부하고 있습니다.
1장에서는 문자열을 간단하게 출력하는 스크립트와 리다이렉션에 대해 알아보겠습니다.
아주 간단한 스크립트!!
hello world를 출력하는 스크립트
#!/bin/bash echo Hello World |
이 스크립트는 단지 두 줄로 되어 있을 뿐이지만, 스크립트로서 갖추어야 할 기본적인 요소는 갖추고 있다. 먼저 첫 번째 줄에서는 이 파일을 실행하기 위해 필요한 프로그램의 경로를 명기했다. 아마도 다들 알고 있겠지만, bash란 셸의 일종이며, /bin/bash는 이 셸의 실행 파일이 있는 경로이다. 셸은 명령어 해석기로 들어오는 명령을 해석하여 이것이 내부 명령어라면 바로 실행을, 외부 명령어라면 해당하는 실행 파일을 찾아 메모리에 필요한 부분을 적재한다. 이 부분이 없다면 다음에 오는 명령을 실행할 수는 없을 것이다.
두 번째 줄은 실제적인 명령을 내리는 부분이다. 여기에서는 'Hello World'라는 말을 터미널에 출력하라는 명령을 내렸다. 물론 다른 말로 바꾸어도 좋을 것이다.
만약에 ./hello.sh: Command not found. 와 같은 꼴을 보게 되었다면, 아마도 첫 번째 줄의 '#!/bin/bash'가 문제일 것이다. 'whereis bash'나 'finding bash' 명령을 내려 bash의 경로를 확인해 보자. 그리고 이 경로를 첫 번째 줄에 기입한다. (첨가!'which bash'도 쓸만할것이다. 엉뚱맞게 bash가 없는경우라면, 자신이 쓰고있는 셸을 써라. 하지만 bash를 설치하는걸 추천한다. bash는 매우 강력한 셸이다.)
엄청나게 간단한 백업 스크립트
#!/bin/bash tar -cZf /var/my-backup.tgz /home/me/ |
이 스크립트는 터미널에 메시지를 출력하는 대신 사용자의 홈 디렉토리를 tar-ball형식으로 묶는다. 이 스크립트는 실제로 사용할 만한 것은 아니다. 먼저 사용자에 따라 경로를 일일히 조절해야 하며, 여러 사람이 사용하면 백업 파일이 서로 덮어 쓰게 되어 백업이 망가질 수도 있다. 이런 백업 스크립트를 실제로 사용할 만 하게 만들어 놓은 것이 뒷 부분에 나올 것이다. 이것은 그냥 예제일 뿐이니까, 한번 시험해 보고는 바로 삭제하는 것이 좋을 것이다.
리디렉션의 모든 것
정의와 기본 설명
stdin(표준 입력), stdout(표준 출력), stderr(표준 에러)라는 세 가지의 파일 디스크립터가 있다. 파일 디스크립터가 무엇인지 일일히 설명하기는 그렇고.... 간단하게 이해해 보자. 어떤 프로그램을 실행했을 때 화면에 주루룩 하고 원하는 결과가 뜨는 것이 표준 출력이다. 어떤 프로그램을 실행하기 위해 꼭 필요한 요소를 프로그램을 실행할 때 같이 입력해 주는 것이 표준 입력이다. 이 정도만 알고 시작하면 될 것이다.
먼저 다음과 같은 내용을 간단히 실행해 보자. 백문이 불여일견, 백견이 불여일행인 법. ^^
1. 표준 출력을 파일로 보내기
2. 표준 에러를 파일로 보내기
3. 표준 출력을 표준 에러로 보내기
4. 표준 에러를 표준 출력으로 보내기
5. 표준 에러와 표준 출력을 파일로 보내기
6. 표준 에러와 표준 출력을 표준 출력으로 보내기
7. 표준 에러와 표준 출력을 표준 에러로 보내기
먼저 간단히 말해두겠는데, 버퍼에 남아 있는 표준 출력이나 표준 에러를 화면에 출력해 보는 것은 아주 쉽지만, 그 시도와 동시에 내용이 날아간다는 점을 상기하자.
예제 : 표준 출력을 파일로 보내기
프로그램의 실행 결과를 파일에 바로 저장하는 방법이다. 이 방법은 언제 쓰면 좋으냐 하면.... 그렇다, 수치해석 숙제 할 때 줄줄이 에러값 나오는 것, 이 방법으로 하면 파일에 기록하는 코드 없이도, 화면 캡처 따위 하지 않아도 아주 간단하게 해결된다. ^^
예제 : 표준 에러를 파일로 보내기
방법은 마찬가지이다. 이 경우에는 에러 메시지를 파일에 저장하는 것 뿐이다. 역시 같은 방법으로 다음과 같이 해 보자.
grep da * 2> grep-errors.txt |
앞서 표준 출력을 파일로 보냈을 때와 마찬가지로, 'grep-errors.txt' 파일이 만들어지며 화면 대신 이 파일 안에 에러 메시지가 기록된다. 여기에서 숫자 2는 표준 에러를 뜻하는 파일 디스크립터이다. 2가 들어가지 않으면 표준 출력이 저장된다.
예제 : 표준 출력을 표준 에러로 보내기
이 방법은 프로그램을 실행했을 때의 표준 출력을 표준 출력 디스크립터 대신 표준 에러와 같은 방식으로 출력하는 것이다.
grep da * 1>&2 |
이와 같은 방법으로 명령의 표준 출력이 표준 에러에게 넘겨졌다. 그런데 정말 이것만으로 이해가 착착 간다면 정말 이 문서 볼 필요 없다. 어쩔 수 없이 추가 설명을 달아야만 하는 부분인데..... 간단히 설명하겠다. 'grep da *'는 우리가 익히 알고 있는 단순한 명령이다. 이 뒤에 붙은 숫자는 파일 디스크립터이며 특히 1은 표준 출력을 의미한다. 2는 표준 에러 되겠다. 그런데 사실, 조금만 신경 쓰면 알 수 있는 부분이지만 '1>'는 그냥 '>'와 같은 것이다. 이유는 각자 생각해 보자. 금방 결론이 나올 것이다. 참고로 0은 표준 입력, 3 이후는 다른 파일이 입출력용으로 할당될 때 사용하는 것으로, 그냥 적어 넣으면 에러 메시지를 볼 수 있을 것이다.
리디렉션을 '2>&1'과 같이 주면 표준 에러를 표준 출력과 같은 곳으로 보내라는 뜻이며, '1>&2'의 경우는 표준 출력을 표준 에러와 같은 곳으로 보내라는 뜻이다.
예제 : 표준 에러를 표준 출력으로 보내기
위 내용을 잘 섭렵해 왔다면 생각해 볼 필요도 없는 부분이다.
grep * 2>&1 |
자, 표준 에러를 표준 출력으로 보내어 함께 출력하였다. 만약에 이 결과를 파이프를 통해 more나 less 등으로 보낸다면, 표준 출력과 표준 에러가 뒤섞인 형태를 보게 될 것이다.
예제 : 표준 출력과 표준 에러를 파일로 보내기
이 내용 역시 위와 똑.같.다. 라고 봐도 무방하지만..... 이것을 한번에 파일로 보내는 부분은 함께 보도록 하자.
rm -f $(find / -name core) &> /dev/null |
따로이 디스크립터를 사용할 필요 없이 '&>'로 리디렉션 하는 것 만으로 해결된다. 이 방식은 표준 출력과 표준 에러를 함께 파일로 보낼때 사용한다. 이 명령을 크론에 넣어 두면, 일정한 시간마다 모든 디렉토리에 있는 core 파일을 삭제한다. 여기에서는 표준 출력과 표준 에러를 모두 '/dev/null'로 보내 실제로는 날려 버리지만, 굳이 이 내용을 확인하고 싶다면 적당한 파일로 출력하여 살펴보도록 하자.
다음 시간에는 파이프(Pipes)와 변수에 대해 공부해보도록 하겠습니다~
'Linux(리눅스)' 카테고리의 다른 글
리눅스(Linux) CentOS7 고정아이피 설정 (0) | 2019.05.23 |
---|---|
리눅스(Linux) vi편집기 명령어 (0) | 2019.05.21 |
리눅스 환경설정 파일 & 커널 파라미터 & 프로젝트/이슈 관리 (0) | 2019.05.21 |
VirtualBox에 설치한 OS가 갑자기 안될때 (0) | 2019.05.17 |
리눅스 BASH Shell 프로그래밍 기초(2) (0) | 2019.05.10 |