다음과 같은 변수에 명령 출력을 저장하는 스크립트가 있습니다.
my_var=$(명령)
그런데 출력 중 일부가 변수에 저장되지 않는데, 지연되어서 그런가 봐요... 출력을 변수에 저장한 후 화면에 제가 원하는 라인을 출력하기 때문에 지연되는 건 확실하고, 처리해봤는데..
[편집]중요! 출력이 stderr[/edit]로 전송되는 것으로 나타났습니다.
출력을 변수에 저장하기 전에 종료 코드(출력이 100% 완료된 경우)를 기다리게 하려면 어떻게 해야 합니까?
예시를 안 올렸거든요제 생각에는사용자들은 이것이 사악하다고 불평할 것입니다. 그러나 그렇지 않으며 저는 제 서버에서 스크립트를 실행하고 있습니다. 요청 시 예:
# Grab the output, so we can check for error... If error then retry same password after wait time
outpt="$(hydra -l $hydra_user -P $tmp_passwds $hydra_all_params $hydra_host $hydra_module)"
# Grep for "ssh protocol error" line
banln=$(echo "$outpt" | grep 'ssh protocol error')
# Show ban status, update wait_time
if [ "$banln" != "" ];then
echo "[STATUS] Oops, we got banned! (increasing wait_time + 1 second)"
wait_time=$wait_time+1
# Start retry procedure until not banned
fi
이 예의 문제는 내가 찾고 있는 줄([ERROR] ssh 프로토콜 오류)이 명령의 출력이 변수에 저장된 후에 나오는 것 같다는 것입니다.
답변1
프로세스가 백그라운드에서 실행 중이거나 분기되지 않는 한 대기 시간으로 인한 것은 아닙니다. 간단한 테스트를 통해 이를 확인할 수 있습니다.
# FOO=$(sleep 10; echo whee;); echo $FOO
whee
명령은 실행될 때까지 완료되지 않으며 sleep
, 그 후에는 표준 출력으로 전송된 메시지가 변수에 성공적으로 저장됩니다. 이를 통해 우리는 다음과 같은 몇 가지 점을 추론할 수 있습니다.
- 명령이 완료될 때까지 변수는 저장되지 않습니다.
- STDOUT은 명령 실행 중에 연결된 상태를 유지합니다.
이 시점에서 다음 두 가지 중 하나가 발생합니다.
- 메시지는 STDOUT에 기록되지 않고 STDERR에 기록될 수 있습니다.
- 명령이 실제로 완료되고 있습니다. (백그라운드, 분기된 하위 프로세스 등)
대개문제는 전자입니다.