redirection
쉘은 redirection을 이용해서 명령어 파일을 복사하고, 열고, 닫고, 다른 파일에게 참조되고, 또는 다른 파일들을 바꿀 수도 있다.
redirection으로 현재 쉘 실행 환경을 바꿀 수도 있다.
redirectioin은 왼쪽에서 오른쪽으로 순서대로 가공되어 사용되는데,
{변수 이름} 혹은 파일 디크립터 뒤에 redirection이 올 수 있다.
무슨 말인가 하면, >&- and <&-, 를 제외한 redirection operator 가 사용되면, 쉘은 10보다 큰 값을 갖는 file descriptor를 {varname = 변수이름}에 할당한다. 그리고 이게 제공되면 명령어 범위 내에서 redirection이 지속되면서 shell programmer가 file descriptor 의 수명을 조절할 수 있게 만든다.
>&- and <&- 연산자의 경우, varname은 닫을 file descriptor 를 의미하게 된다.
file descriptor number 가 생략된 경우, '<' 연산자 같은 경우엔 standard input (fd 0)을 참조하게 되고,
'>' 연산자는 standard output (file descriptor 1)을 참조하게 된다.
즉 > file 은 1> file 과 같은 의미가 되는 것이다.
ls > dirlist
를 하면 dirlist에 ls 를 한 output이 저장된다. 즉 현 디렉토리 목록이 저장되는 것이다.
>의 기본 좌측값은 1, standard ouput이기 때문에 이 명령은 곧 아래 명령과 같다.
ls 1> dirlist
>& operator 는 stdout, stderr 를 redirect 하는 명령어다.
>& file
명령어는 stdout, stderr 를 모두 file로 redirect하는 명령어고,
1> file 2> file
과 같은 의미가 된다. (다만 위에서는 file이 한번만 열리고 아래에선 두번 열린다.)
한편 >& 명령어는 dup과 같은 뜻인데, 2>&1 은 dup(1,2)랑 같은 뜻이고 2<&1과 절대적으로 같은 뜻이 된다.
dup함수는 dup(int oldfd, int newfd) prototype을 갖고, (newfd)가 (oldfd)가 가리키는 file을 참조하도록 만든다.
즉 dup(1,2)는 2가 1이 가리키는 표준 출력을 가리키게 만드는 것이다. (그래서 표준 출력, 표준 에러가 동시에 file에 overwrite되는 것이다)
이런 명령어가 쓰이는 예시는
자동 CI/CD를 위해 쉘 스크립트를 작성하는 경우인데,
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &
이런 명령어를 사용할 때, 에러나 표준 출력의 내용이 background (&)에 적히도록 하는 명령어가 되는 것이다.
(&는 background 에서 동작하도록 만든다.)