>��>>�A>&�Ƃ������Ђ�ς�Ɏg���郊�_�C���N�g�ɑ��A�قƂ�ǎg���邱�Ƃ̂Ȃ����_�C���N�g��>|��<>���B���ۂɂ͋����[���@�\�ł���A�����u�m��ꂴ��v���_�C���N�g�ɂ��Đ������悤�B�i�ҏW���j
�@�V�F��������@�\�̓J�[�l�������Ă���@�\���_�C���N�g�ɗ��p������̂������B�܂�A�V�F���̋L�q���_�C���N�g�ɃV�X�e���R�[���Ɍ��ѕt���悤�ȋ@�\�������Ƃ������Ƃ��B�R�}���h�̎��s�A�p�C�v�A���_�C���N�g�Ȃǂ́A�������肻�̂܂܃V�X�e���R�[���ɒu�������B
�@���_�C���N�g�ł���A�قƂ�ǂ̃P�[�X��>�Ȃ�����>>�Ŏ������͂����B2>&1�Ƃ����L�q�͂����1�̋@�\�Ɏv���邪�A�����>&�Ƃ������_�C���N�g�̓T�^�I�Ȏg������1�ł���A�܂�̓��_�C���N�g���B
�@>�A>>�A>&�͂悭�g���郊�_�C���N�g�Ƃ�����B�������Ash(1)�̃}�j���A���ɂ͎��̂悤�ɁA9�̃��_�C���N�g���Љ��Ă���B
Redirection operators: < > << >> <> <& >& <<- >|
�@���̒��ł����ɂȂ��݂̂Ȃ����_�C���N�g��>|�Ɓ�₾�낤�B���ہA�����̃��_�C���N�g���g���邱�Ƃ͂قƂ�ǂȂ��B
�@���������͂����͋����[���@�\�ł���A�V�F�����ɂ߂Ă����̂ł���A���Ўg������m���Ă��������B�����sh(1)�̃\�[�X�R�[�h��ǂ݂Ȃ���A����烊�_�C���N�g������������̂����Љ��B
�@�V�F���̃\�[�X�R�[�h��ǂނƂȂ�ƁAFreeBSD sh�iash�j���K�x�ȃ\�[�X�R�[�h�ʂň����₷���B���_�C���N�g�̏�����/usr/src/bin/sh/redir.c�ɋL�ڂ���Ă���B
�@>�̃��_�C���N�g���������Ă���̂�redir.c��190�s�ڂ�case NTO:����̍s���B-C�I�v�V�������������邽�߁A�܂�>|�Ə����R�[�h�����L���邽�߂Ɏ�ǂ݂ɂ����Ȃ��Ă��邪�A�ŏI�I�ɂ�open(2)�V�X�e���R�[���ɒu��������Ă��邱�Ƃ�������B
190 case NTO: 191 if (Cflag) { 192 fname = redir->nfile.expfname; 193 if (stat(fname, &sb) == -1) { 194 if ((f = open(fname, O_WRONLY|O_CREAT|O_EXCL, 0666)) < 0) 195 error("cannot create %s: %s", fname, strerror(errno)); 196 } else if (!S_ISREG(sb.st_mode)) { 197 if ((f = open(fname, O_WRONLY, 0666)) < 0) 198 error("cannot create %s: %s", fname, strerror(errno)); 199 if (fstat(f, &sb) != -1 && S_ISREG(sb.st_mode)) { 200 close(f); 201 error("cannot create %s: %s", fname, 202 strerror(EEXIST)); 203 } 204 } else 205 error("cannot create %s: %s", fname, 206 strerror(EEXIST)); 207 goto movefd; 208 } 209 /* FALLTHROUGH */ 210 case NCLOBBER: 211 fname = redir->nfile.expfname; 212 if ((f = open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) 213 error("cannot create %s: %s", fname, strerror(errno)); 214 goto movefd;
�@case�Ŏw�肳��Ă���l�́A�p�[�T��ʂ��ĕ������ꂽ�p�[�c�������Ă���B/usr/src/bin/sh/nodetypes�ɂ܂Ƃ܂�������������̂Ō��Ă��������BNTO:��>�ANCLOBBER��>|���B>>�ɂ�NAPPEND�����蓖�Ă��Ă���A<>��NFROMTO�����蓖�Ă��Ă���B
115 NTO nfile # fd> fname 116 NFROM nfile # fd< fname 117 NFROMTO nfile # fd<> fname 118 NAPPEND nfile # fd>> fname 119 NCLOBBER nfile # fd>| fname
�@NTO:�̏����́A-C���w�肳��Ă���ꍇ�ɁA���̂悤�Ƀt�@�C�����I�[�v�����鏈���ɂȂ��Ă���B-C�́A�u�����̃t�@�C�������݂���ꍇ�ɂ�>�ł̏㏑���͎��{���Ȃ��v�Ƃ����I�v�V�������B
190 case NTO: 191 if (Cflag) { ... 194 if ((f = open(fname, O_WRONLY|O_CREAT|O_EXCL, 0666)) < 0)
�@���̂悤��-C���w�肵��sh(1)�����s����Ɠ�����������B-C���w�肳��Ă���ꍇ�A>�Ńt�@�C����V�K�쐬���邱�Ƃ͂ł��邪�A�t�@�C�������݂���ꍇ�ɂ͏㏑���ł��Ȃ��B>|�́A���Ƃ�-C���w�肳��Ă���ꍇ�ł��A�����̃t�@�C���ւ̏㏑�������{���邽�߂̃��_�C���N�g���B
% sh -C $ echo test > file $ echo test > file cannot create file: �t�@�C�������݂��܂� $ echo test >| file $
�@�܂�A-C���w�肳��Ă���ꍇ�ɂ͏������قȂ邪�A-C���w�肳��Ă��Ȃ��ꍇ�ɂ�>��>|�͓������������邱�ƂɂȂ�Bcase NTO:�ɓ���ƁA-C���w�肳��Ă��Ȃ��ꍇ�ɂ͂��̂܂�case NCLOBBER:�̏����Ɉڂ��Ă���̂͂��̂��߂��B>��>|�ŏ��������L���Ă���B
210 case NCLOBBER: 211 fname = redir->nfile.expfname; 212 if ((f = open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) 213 error("cannot create %s: %s", fname, strerror(errno)); 214 goto movefd;
�@>�͂܂�A�uO_WRONLY|O_CREAT|O_TRUNC, 0666�v�̃I�v�V�����Ńt�@�C�����J���Ƃ������������Ă��邱�ƂɂȂ�B�t�@�C���͏������ݐ�p�ŊJ���A�t�@�C�������݂��Ȃ��ꍇ�ɂ�0666�Ƀ}�X�N��K�p�����p�[�~�b�V�����ŐV�K�쐬���A�J���Ɠ����Ƀg�����P�[�g�����{���A�t�@�C���T�C�Y��0�ɂ��Ă��珑�����݂��J�n����A�Ƃ������ƂɂȂ�B
�@�t�@�C�����J�������Ƃ́Amovefd:�֏������ڂ��Ă���B
175 movefd: 176 if (f != fd) { 177 if (dup2(f, fd) == -1) { 178 e = errno; 179 close(f); 180 error("%d: %s", fd, strerror(e)); 181 } 182 close(f); 183 } 184 break;
�@�J�����t�@�C�����o�͐�A�܂��͓ǂݍ����ɂȂ�悤��dup2(2)�ŃR�s�[���Ă��邱�Ƃ�������B
177 if (dup2(f, fd) == -1) { ... 179 close(f); ... 181 } 182 close(f);
�@���̂悤�ɁA���ۂɃV�F���̃\�[�X�R�[�h��ǂނ��ƂŁA���ۂɂ͂ǂ̂悤�ȓ�����������̂����悭������B
Copyright © ITmedia, Inc. All Rights Reserved.
��IT eBook