셸 스크립트: 입력을 백그라운드 프로세스로 보냅니다.

셸 스크립트: 입력을 백그라운드 프로세스로 보냅니다.

다음 스크립트를 사용하여 폴더를 모니터링하고 있으며 크기가 변경되고 파일이 존재하지 않으면 스크립트가 실행됩니다.

#!/usr/bin/sh
SCRIPT="dim_import/xdir"

while true;
do
    size=$(du -s dim_import | cut -b 1-2)
    if [ $size -gt 32 ]; then
        if [ ! -f files ]; then
          $SCRIPT
        fi
    fi
    sleep 2
done

나는 이렇게 스크립트를 실행한다.

>watcher &

문제는 감시자에서 실행되는 스크립트에 입력이 필요하다는 것입니다. 프롬프트를 에코하지만 입력은 해당 스크립트가 아닌 현재 셸로 전송됩니다. 따라서 1234를 입력하면 다음과 같은 결과를 얻습니다.

sh: 1234:  not found.

입력이 올바른 위치로 전송되는지 어떻게 확인할 수 있나요?

나는 다양한 방법을 시도했지만, 내가 하는 독특한 방식으로 인해 그 중 아무 것도 작동하지 않는 것 같습니다. 또한 더 나은 접근 방식/해결 방법에 열려 있습니다. 스크립트는 매개변수로 보내려는 입력을 처리할 수도 있습니다.

편집: 62918과 같은 번호를 보내려고 합니다.

편집: 이와 같은 작업을 수행할 수도 있지만 동일한 오류가 발생합니다.

    SCRIPT="dim_import/xdir"

    while true;
    do
        size=$(du -s dim_import | cut -b 1-2)
        if [ $size -gt 32 ]; then
            if [ ! -f files ]; then
              echo "SR Number: "; read srNum
              $SCRIPT $srNum
            fi
        fi
        sleep 2
    done

노트:나는 Bash를 사용하지 않습니다. 저는 Sh를 사용하고 있습니다.

답변1

음, 실제 질문은 실제로 스크립트에 어떤 입력을 보내고 싶은가입니다. 빈 입력을 원하면 다음을 실행하십시오.

$SCRIPT < /dev/null

$size의 내용과 같은 특정 입력을 제공하려면 다음을 실행하십시오.

echo "$size" | $SCRIPT

입력을 입력하려면 입력을 입력하기 위해 다시 전경으로 가져온 다음 다시 배경에 넣어야 합니다. 이를 수행하는 능력은 쉘에 작업 제어 기능이 있는지 여부에 따라 다릅니다(대부분은 있지만 원래 Bourne 쉘에는 없습니다). 다음을 수행하십시오.

  • 실행 fg %watcher하거나 fg %1(실행 후 표시되는 작업 번호를 사용하여 jobs -l) 프로세스를 포그라운드로 가져옵니다.
  • 원하는 내용을 입력하고 Enter를 누르세요.
  • Ctrl-Z를 입력하여 다시 배경으로 되돌립니다(또는 중지 문자가 무엇인지 확인하기 stty -a위해 사용 및 검사 ).susp
  • bg %1Ctrl-Z(또는 임의의 숫자)를 눌러 프로그램을 중지한 후 다시 백그라운드로 전환하세요.

또 다른 대답은 명명된 파이프를 사용하는 것입니다. 다음은 예입니다( tr표시하기 위해 스크립트 대신 사용됨).

$ mkfifo my_fifo
$ tr a-z A-Z < my_fifo &
$ exec 6> my_fifo
$ echo here is some input for the fifo >&6
$ HERE IS SOME INPUT FOR THE FIFO

먼저 스크립트를 실행하여 fifo에서 입력을 받습니다(먼저 스크립트를 실행하는 것이 중요합니다). 그런 다음 exec 6> ...쉘의 파일 설명자 6을 fifo에 씁니다. 그런 다음 출력을 보내고 싶을 때마다 (를 통해 >&6) 파일 설명자 6에 씁니다. 끝에 있는 "HERE IS..."는 제가 입력한 것이 아니라 단지 tr의 출력입니다.

답변2

많은 연구를 통해 제약 조건상 이것이 불가능하다는 것을 확인했습니다. 그러나 이상적이지 않은 해결 방법을 찾았습니다.

기본적으로 나는 명명된 파이프(".in"이라고 함)를 만들고 여기에 정보를 보냅니다. "i[input]" 유형을 실행하기 위한 함수를 만들었습니다.

SCRIPT=".dim_import/xdir"

while true;
do
    size=$(du -s .dim_import | cut -b 1-2)
    if [ $size -gt 32 ]; then
        if [ ! -f ~/files ]; then
          echo "SR Number (i [number]): "; 
          read srNum < ~/.in
          $SCRIPT $srNum
          sleep 10
          ~/scripts/listSR
        fi
    fi
    if [ ~/ ]
    sleep 5
done

소개 기능:

function i
{
  set +u
  echo $1 > ~/.in
  set -u
}

관련 정보