쌍괄호 기호
c
cmd << LIMITER | cmd1 >> file
<< : heredoc
- 표준 입력을 통해 명령에 넣겠다는 의미
- LIMITER : 표준 입력 중단 장치
>> : 이어쓰기
- 파일이 없는 경우 : 새로 만든다.
- 파일이 있는 경우 : 해당 파일 뒤에 이어서 쓴다.
구현 방향
- heredoc : 임시 파일을 먼저 만들고 입력을 다 받은 후, 이를 infile의 fd에 넣어주는 방법으로 한다.
- 이렇게 만들면 임시 파일을 닫아야 하는 고민도 줄어들게 된다.
몇 가지 바꾸기
-
기존의 infile 항목은 비워둔다.
-
어디부터 어디까지가 limiter인지, 명령인지, outfile인지 확인해야 한다.
-
>>의 경우 대상 파일에 덮어쓰기가 아닌 이어서 쓰기를 해야 한다.따라서, open()에 들어가는 옵션을 바꿔줘야 한다.
c
tools->outfile_fd = open(tools->outfile, \
O_RDWR | O_CREAT | O_APPEND, 0644);
heredoc 만들기
fork 되기 전에 부모에서 사전에 만들고, 입력까지 다 받아야 한다!
c
static void heredoc_start(t_box *tools)
{
size_t lim_len;
char *str;
tools->infile_fd = open(HEREDOC_FILE, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (tools->infile_fd == -1)
exit_cmd(NO_FILE, tools);
lim_len = ft_strlen(tools->limiter);
while (1)
{
write(1, "heredoc> ", 9);
str = get_next_line(0);
if (!str)
break ;
if (ft_strncmp(tools->limiter, str, lim_len) == 0 && \
ft_strlen(str) == lim_len + 1)
break ;
write(tools->infile_fd, str, ft_strlen(str));
free(str);
}
close(tools->infile_fd);
tools->infile_fd = open(HEREDOC_FILE, O_RDONLY, 0644);
if (tools->infile_fd == -1)
exit_cmd(NO_FILE, tools);
}
- 새 파일의 위치를 정한다. (여기서는
HEREDOC_FILE로 미리 지정 :/var/tmp안에 만드는 것이 좋다.) - 기존 infile의 fd 위치에 넣어준다.
open()옵션을O_WRONLY | O_CREAT | O_TRUNC으로 해준다. - 작성한다.
- 표준 입력을 계속 받는다.
write()를 이용해 계속 써준다.- 입력이 끝나면 (= NULL 또는 limiter 입력) 쓰는 것을 끝낸다.
- 닫고 다시 연다. (중요!!)
- 닫고 다시 열어주지 않으면, 파일이 가리키는 위치가 파일 맨 끝이므로 명령이 제대로 실행되지 않을 수 있다.
- 이때 열어줄 때의
open()옵션은O_RDONLY로 해준다.