목록bash (5)
살아가는 이야기
C로 작성된 운영체제답게 Unix에서는 프로세스의 반환 값(종료 코드)을 이용하여 여러 명령어를 조합할 수 있다. 종료 코드는 정수 값인데, 그래서 초기 C에서는 함수 정의 시 타입을 적지 않으면 int로 간주했었다. 여튼 프로세스의 종료 코드는 여러 가지로 유용하다. bash에서는 변수 $?의 값을 통해 종료 코드를 알 수 있다. 다음은 Msys2에서 종료 코드를 확인한 화면이다. 그럼 Windows에서는 프로세스의 종료 코드를 어떻게 확인할 수 있을까? 정확히 어느 버전부터인지는 몰라도 %errorlevel%이라는 변수를 통해 확인할 수 있다. 실제 변수명은 errorlevel이고 이를 사용하려면 변수명을 %로 감싸야 한다. 초기 너무 돈을 밝힌다는 비난 때문인지 몰라도, 환경 변수를 참조할 때 Wi..
cygwin에 /usr/bin/zip 프로그램이 있다. 이것으로 디렉토리를 압축할 수 있는데, 디렉토리 내용을 모두 압축하는 옵션은 -r 옵션이다. 만약 폴더 MyFolder 전체를 압축하고 싶다면 다음과 같은 명령어를 쓰면 된다. zip -r MyFolder MyFolder 원래 다음과 같이 써야 하지만 zip -r MyFolder.zip MyFolder 첫 번째 인수를 zip 파일로 간주하기 때문에 .zip을 생략해도 된다. 폴더 내의 모든 파일(폴더)를 개별 압축 파일로 압축하고 싶다면 다음과 같이 쓰면 된다. for f in *; do echo $f; zip -r $f $f; done
예전에 csh이나 tcsh을 사용할 때에는 명령어 반환 값(exit code, 리턴 코드)이 $status에 저장되었었다. bash에서는 명령어 결과 반환 값이 어디에 저장되는지 몰라서 한동안 헤메었던 적이 있다. bash의 명령어 반환 값은 바로바로 $? 에 저장된다. ㅎㅎ
bash for 루프 구문은 항상 사용할 때마다 잊어 버린다. 그리고 이것을 찾으려면 또 10분 정도를 허비한다. 그래서 여기에 간단한 for 루프 사용 예를 적기로 했다. for file in $@; do echo $file; done 이렇게 적으면 명령행 인수로 주어진 모든 이름을 출력한다.현재 디렉터리에 있는 모든 .h 파일에 대응되는 .c 파일 이름을 출력하고 싶다면 아래와 같이 하면 된다.for file in *.h; do echo `basename $file .h`.c; done유틸리티 프로그램 basename을 쓸 때, 그냥 작은따옴표(')가 아니라 역따옴표(`)를 사용한 것에 주의하자.나 같은 사람들이 많았나보다. 다음 URL에 보니 http://spiralbound.net/2007/07/..
내가 Unix를 배울 때는 Bourne shell이 기본이었다. 그냥 sh이라고 되어 있던 프로그램이다. 그런데 잠시 후 C shell이 등장해서 모두들 유행처럼 csh로 갈아탔다. 그리고 tcsh과 ksh이 등장했었다. 그런데 요즘 linux를 설치하면 bash가 기본으로 설정된다. csh, tcsh에서는 표준 오류를 파이프로 받으려면 명령어 |& more 이렇게 하면 되었다. 그런데 bash에서는 조금 복잡해졌다. 2번 포트(표준오류)를 1번 포트(표준출력)와 합친 후에 이를 파이프로 받아야 한다. 그래서 다음과 같이 써야 한다. 명령어 2>&1 | more 표준오류만 파이프로 받으려면 꼼수를 써야 한다. 표준출력을 다른 곳으로 보내고 그 결과를 표준오류를 표준출력과 합친 다음에 표준출력을 파이프로 ..