/dev/random에서 많은 양의 데이터를 읽는 bash 스크립트가 있습니다. 임의의 데몬을 시드하려면 사용자가 무작위로 입력해야 합니다. 그러나 스크립트가 완료되면 입력된 모든 내용이 명령 입력으로 덤프됩니다. 코드는 다음과 같습니다.
for i in ${users_thing[@]}
do
pass[${num}] = $(dd if=/dev/random status=noexfer bs=1 count=128 | base64) & #generate password
echo -n "Creating password: `expr $num + 1` of $sizes "
#tell what's going of
echo -en "\033[s"
while [[ $(jobs) != *Exit* ]] #while the program is still running
do
for j in ${spinny_thing[@]} #now spin
do
echo -en "\033[u\033[1D$j "
done
done
echo ""
num=`expr $num + 1`
done
그래서 나는 포그라운드 프로세스를 중단하지 않고 stdin을 덤프할 수 있기를 원하며, 따라서 read
일시 중지된 이후 제거됩니다. 어떻게 그리는 것이 가능한가요 /dev/null
?
답변1
원하는 것이 무엇인지 이해했다면 read
이를 사용하여 목표를 달성해야 합니다. 그러나 무기한 차단을 원하지 않으므로 read
시간 초과를 설정합니다.
예를 들어:
#!/bin/bash
sleep 5
echo done sleeping
read -N 10000000 -t 0.01
sleep
런타임 시 원하는 내용을 입력 할 수 있습니다 . 완료되면 bash는 이를 호출하고 read
STDIN 버퍼의 모든 것을 흡수합니다.
제조업체에서는 -N
터미널 read
을 라인 모드가 아닌 문자 모드로 설정합니다. 이는 터미널 에뮬레이터가 일반적으로 시간에 맞춰 문자만 보내기 때문입니다 Enter. 따라서 를 누르지 않고 문자를 입력하면 Enter프롬프트에 해당 문자가 표시됩니다. 숫자는 읽을 문자 수입니다. 스크립트가 끝날 때쯤에는 사용자가 1천만자를 입력할 수 없을 것 같습니다.
이로 -t
인해 0.01초 후에 읽기 시간이 초과됩니다. 그래서 사용자가 1,000만자를 0.01초 안에 완성하지 못한다면 read
포기하고 지금까지 입력한 것을 얻으세요.
답변2
&
일반적으로 비대화형 셸(예: 셸 스크립트)에서 명령을 비동기적으로(즉, 백그라운드에서 실행) 실행하고 명령의 표준 입력을 명시적으로 리디렉션하지 않으면 셸은 해당 명령을 다음 /dev/null
으로 리디렉션합니다. 잠재 고객을 방해하지 마십시오. 물론 네 문제는 너야생각하다cat
사용자의 임의 입력을 포착하고 대화형 쉘이 이를 보지 못하도록 방지 한다는 의미에서 백그라운드 프로세스는 포그라운드를 방해합니다 .
이식성이 얼마나 좋은지는 잘 모르겠지만 <&0
"이 백그라운드 프로세스가 전면 표준 입력에 연결되기를 정말로 원합니다"를 사용하여 셸의 이 동작을 재정의할 수 있는 것 같습니다.
cat <&0 > /dev/null &
나는 지난 10시간 동안 이것을 좀 더 테스트해 왔고 (내 테스트에서는 여전히 매우 제한적이지만) 항상 작동하고 bash
때로는 (항상 그런 것은 아니지만) /bin/sh
YMMV에서 작동합니다.