이 질문의 동기는 내가 감시 장치의 기능을 테스트하고 있고 종료될 때까지 아무것도 하지 않고 기다리지 않고 장치를 열 수 있는 셸 내장 명령이 있는지 궁금하기 때문입니다.
Echo/touch
그냥 작업을 수행한 후 바로 장치를 켜고 끄는 것 같습니다. Cat
작동하지 않는 것 같습니다.
나는 C 응용 프로그램을 사용하여 동일한 작업을 수행하고 있지만 쉘 스크립트에 이에 대한 몇 가지 조항이 있는지 알고 싶습니다.
답변1
Bourne 쉘에서는
exec 3< "$device"
셸의 파일 설명자 3에서 장치를 엽니다.
이는 C와 거의 동일합니다.
fd = open(device, O_RDONLY);
if (fd < 0) handler_error(...);
if (fd != 3) { dup2(fd, 3); close(fd); }
(또한 해당 fd에 ksh93
하나를 만들었습니다 ).fcntl(3, F_SETFD, FD_CLOEXEC)
닫으려면:exec 3<&-
zsh
, ksh93
및 에서는 bash
다음 fd = open(device, O_RDONLY)
과 같이 작성할 수도 있습니다.
exec {fd}< "$device"
여기서 파일 설명자는 9보다 큰 첫 번째 자유 설명자가 되며 $fd
.
닫으려면:exec {fd}<&-
for , for 및 for <
로 바꿉니다 .>
O_WRONLY|O_CREAT|O_TRUNC
<>
O_RDWR|O_CREAT
>>
O_WRONLY|O_CREAT|O_APPEND
zsh
아직 하나 있어요sysopen
내장( zsh/system
모듈 내)여기서 플래그를 정확하게 지정할 수 있습니다.
POSIX 호환 쉘에서는 다음 exec
과 같습니다.특수 내장, 파일을 열 수 없는 경우 비대화형(스크립트 종료)일 때 치명적인 오류입니다. command
이 명령을 사용하여 비활성화 할 수 있습니다 .
if command exec 3< "$device"; then
do-what-you-need-to-do
else
handle-the-error-yourself
fi
답변2
while sleep 3600; do :; done >/dev/your_watchdog
장치가 쓰기 전용 모드로 열려야 한다는 echo
사실을 (작동 및 실패를 통해) 수집했습니다 .touch
cat