Justin의 개발 로그
article thumbnail

아래와 같이 기본쉘을 지정 후에 초기 파일을 로딩하면 된다.

 

#!/usr/bin/env zsh
test -f ~/.zshrc && . ~/.zshrc

 

test 쉘스크립트에서 아래 두 가지 형태로 사용하고 있습니다.

test expression
혹은
[ expression ]

두번째 방식으로 사용하려면 반드시 [] 대괄호와 expression 사이에는 빈칸이 있어야 합니다.
왜냐하면, '['도 명령문이기 때문입니다.
유닉스 시스템에서는 명령문과 아규먼트 사이에 빈칸이 있어야 합니다.
아래 명령의 결과 긍정이면 '0'이 리턴되고, 부정이면 '1'이 리턴됩니다.

-e 파일이름 - 파일이 존재하는지 여부
-f 파일이름 - 일반파일인지 여부
-b 파일이름 - 파일이 블록파일로 존재하는지 여부
-c 파일이름 - 파일이 캐릭터파일로 존재하는지 여부
-d 파일이름 - 파일이 디렉토리인지 여부점(. 영어로는 dot)은 크게 3가지로 쓰입니다.

1. 숨김(히든) 파일을 만들때 사용하죠
.profile 이러면 ls 에서 안보이고 ls -a 옵션을 줘야 보이죠

2. 쉘의 환경변수를 바꿀 때 사용하더군요
. ~/.profile 이러면 현재 환경변수를 ~/.profile에 설정된 값으로 변경하는 거죠
이 때 앞의 . 은 source의 축약된 표시죠

3. 현재 경로(디렉토리)를 나타내죠
./configure 이러면 현재 /home/oseb/Packages/ffmpeg이라고 하면
/home/oseb/Packages/ffmpeg/configure 라고 하는 걸 줄여서 표시하는 겁니다
부록으로 .. 두 개는 상위 디렉토리를 나타냅니다. 도스에서 dir 하면 보이던게 리눅스에서도 그대롭니다즉, 파일이 없으면 1로 &&에 의해 다음 명령어 수행

 

명령어 연결해서 실행 (  ;   &&   &  )

  • ; - 앞의 명령어가 실패해도 다음 명령어가 실행
  • && - 앞의 명령어가 성공했을 때 다음 명령어가 실행
  • & - 앞의 명령어를 백그라운드로 돌리고 동시에 뒤의 명령어를 실행

 

 

. ~/.zshrc

점(. 영어로는 dot)은 Linux에서 크게 3가지로 쓰입니다.

1. 숨김(히든) 파일을 만들때 사용하죠
.profile 이러면 ls 에서 안보이고 ls -a 옵션을 줘야 보이죠

2. 쉘의 환경변수를 바꿀 때 사용하더군요
. ~/.profile 이러면 현재 환경변수를 ~/.profile에 설정된 값으로 변경하는 거죠
이 때 앞의 . 은 source의 축약된 표시

3. 현재 경로(디렉토리)를 나타내죠
./configure 이러면 현재 /home/oseb/Packages/ffmpeg이라고 하면
/home/oseb/Packages/ffmpeg/configure 라고 하는 걸 줄여서 표시하는 겁니다
부록으로 .. 두 개는 상위 디렉토리를 나타냅니다. 도스에서 dir 하면 보이던게 리눅스에서도 그대롭니다

 

스크립트를 실행하는 방법 차이


1. bash 스크립트파일명
2. 스크립트파일명
3. . 스크립트파일명

이렇게 있는데,
1번의 경우는 명시적으로 스크립트를 실행할 쉘을 지정한 경우입니다.
2번의 경우는 현재의 쉘프로그램에서 스크립트를 실행해줍니다.
그러나 이경우는 스크립트파일에 실행속성이 부여되어 있어야 합니다.
3번의 경우는 현재쉘이 bash(혹은 본쉘 호환쉘)일 경우, 스크립트를 실행해줍니다. 즉 본쉘 호환쉘 내부 명령입니다.

1,2번의 경우는 bash혹은 현재쉘에서 자식프로세스를 만들어 스크립트를 실행합니다.
프로세스는 메모리를 각기 따로 할당하기 때문에, 환경변수등의 메모리 영역이 공유되지 않기 때문에,
export 명령등으로 환경변수를 자식프로세스에 전파해야 자식프로세스가 부모프로세스의 환경변수 값을 가지게 됩니다.

3번의 경우는 자식프로세스를 생성하지 않고, 현재의 쉘(본쉘 호환쉘)에서 직접 명령의 해석해 실행하기에,
환경변수등이 그대로 적용됩니다. 쉘프로세스에서 실행하는 것이라 쉘프로세스의 메모리및 환경변수를 사용하는 것이죠.

종합하자면...
1번의 경우는 명시한 쉘의 자식프로세스에서 실행
2번의 경우는 현재의 쉘의 자식프로세스에서 실행
3번의 경우는 현재의 쉘이 직접실행

 

dvd는 블록장치이므로 -b로 체크하면 리턴값은 '0'이 됩니다.

$ test -b /dev/dvd$ echo $?0


console은 캐릭터장치이므로 -c로 체크하면 리턴값은 '0'이 됩니다.

$ test -c /dev/console $ echo $?0


캐릭터나 블록장치를 -f로 체크하면 아래처럼 '1'을 리턴합니다.

$ test -f /dev/console $ echo $?1


-g 파일이름 - SGID가 설정되어있는지 여부
-u 파일이름 - SUID가 설정되어있는지 여부
-k 파일이름 - sticky bit가 설정되어있는지 여부
   sticky bit가 설정된 파일/디렉토리는 생성한 유저만이 삭제할 수 있습니다.

-h 파일이름 - 파일이 심볼릭 링크인지 여부
-L 파일이름 - 파일이 심볼릭 링크인지 여부
     -h와 -L은 동일한 기능을 수행합니다.

-r 파일이름 - 현 프로세스가 파일에 읽기 권한이 있는지 여부.
-w 파일이름 - 파일에 쓰기 권한이 있는지 여부. read-only 파일시스템에서는 쓰기권한이 있어도 쓰기가 안될 수 있습니다.
-x 파일이름 - 파일에 실행 권한이 있는지 여부. 디렉토리에 실행권한이 있으면 cd를 할 수 있습니다.

-p 파일이름 - 파일이 이름있는 파이프인지 여부(FIFO)
-s 파일이름 - 파일사이즈가 0 초과인지 여부
-t FileDescriptor - 파일디스크팁터가 현 터미널에서 열렸는지 여부

표준입력(0)/표준출력(1)/표준에러(2)는 열려있습니다. 3번은 열려있지 않네요.

$ test -t 0
$ echo $?
0
$ test -t 1
$ echo $?
0
$ test -t 2
$ echo $?
0
$ test -t 3
$ echo $?
1

 

file1 -nt file2 - file1이 file2보다 새로운 파일인지 여부(newer than)

$ touch old
$ touch new
$ test old -nt new
$ echo $?
1

위의 예에서 old가 더 새로운 파일은 아니므로 '1'이 리턴되었습니다.

 

file1 -ot file2 - file1이 file2보다 오래된 파일인지 여부(older than)

$ test old -ot new
$ echo $?
0

old가 더 오래된 파일이므로 이번에는 0을 리턴하였습니다.

 

file1 -ef file2 - file1이 file2의 또 다른 이름인지 여부(symbolic link 또는 hard link)

$ ln -s new new.link
$ test new -ef new.link
$ echo $?
0

위처럼 new 파일의 소프트링크 new.link 파일을 만들었습니다.

그리고 -ef 옵션을 사용하여 new와 new.link를 비교하였습니다.

결과는 두 개의 파일이 동일하다는 리턴값 '0'이 나왔습니다.

이는 하드링크에서도 동일합니다.

 

-n String1 - String1의 길이가 0 초과(nonzero)

-z String1 - String1의 길이가 0(zero)

String1 = String2 - String1과 String2가 일치

String1 != String2 - String1과 String2가 불일치

String1 - String1은 NOT NULL

 

Integer1 -eq Integer2 - Integer1과 Integer2는 일치

-ne - 불일치

-gt - 보다 큰

-ge - 크거나 같은

-lt - 보다 작은

-le - 작거나 같은

 

! - 부정

-a - AND

-o - OR(-a 연산자가 -o 보다 우선순위가 높습니다.)

\(Expression\) - '\'과 함께 쓰이는 괄호는 그룹을 지정할 때 사용

 

 

명령어의 반환값

리눅스(유닉스)의 모든 명령어는 종료할 때 성공 여부를 알려줍니다. 예를들어보죠. 

test 디렉토리가 없는 곳에서 아래 명령을 실행해보세요. 성공했을 때 어떻게 되는지 보시죠. 

mkdir test

그리고 아래 명령을 실행해보세요. 

echo $?

명령의 그룹핑 {}

명령을 그룹핑 할 수도 있습니다. 아래 명령은

mkdir test3 && { cd test3; touch abc; echo 'success!!' } || echo 'There is no dir';
  • mkdir test가
  • 성공했을 때 cd test2; touch abc를 실행하고 success!!를 출력합니다. 
  • 실패했을 때 echo 'There is no dir'를 실행합니다. 
  • 이때 실행되는 명령들은 현재 쉘의 컨텍스트에서 실행됩니다. 만약 서브 컨텍스트에서 실행하고 싶다면 '('와 ')'를 사용하시면 됩니다. 

 

리눅스 특수 문자
https://hack-cracker.tistory.com/26

 

 

profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!