서브쉘 없이 bash에서 명령 출력 반복

서브쉘 없이 bash에서 명령 출력 반복

하위 쉘을 생성하거나 임시 파일을 사용하지 않고 명령 출력을 반복하고 싶습니다.

exit내 스크립트의 초기 버전은 다음과 같았지만 하위 쉘을 생성하고 명령이 필요에 따라 기본 스크립트 대신 하위 쉘을 종료하기 때문에 작동하지 않습니다 . 이는 정책 라우팅을 구성하고 경로 실패를 유발하는 조건을 감지하면 실행을 중지하는 더 큰 스크립트의 일부입니다.

sysctl -a 2>/dev/null | grep '\.rp_filter' | while read -r -a RPSTAT ; do

  if [[ "0" != "${RPSTAT[2]}" ]] ; then
    echo >&2 "RP Filter must be disabled on all interfaces!"
    echo >&2 "The RP filter feature is incompatible with policy routing"
    exit 1
  fi
done

따라서 제안된 대안 중 하나는 서브쉘 사용을 피하기 위해 이와 같은 명령을 사용하는 것입니다.

while read BLAH ; do echo $BLAH; done </root/regularfile

따라서 서브쉘을 피하면서도 내가 원하는 프로그램에서 출력을 계속 얻으려면 이와 같은 명령을 사용할 수도 있어야 할 것 같습니다.

while read BLAH ; do echo $BLAH; done <(sysctl -a 2>/dev/null | grep '\.rp_filter')

불행하게도 이 명령을 사용하면 이 오류가 발생합니다.

-bash: syntax error near unexpected token `<(sysct ...

이것이 실제로 작동하기 때문에 정말 혼란 스럽습니다.

cat <(sysctl -a 2>/dev/null | grep '\.rp_filter')

해당 명령의 출력을 임시 파일에 저장하고 임시 파일에 대한 리디렉션을 사용할 수 있지만 그렇게 하는 것은 피하고 싶습니다.

그렇다면 리디렉션으로 인해 오류가 발생하는 이유는 무엇이며 임시 파일을 생성하는 것 외에 다른 옵션이 있습니까?

답변1

당신은 하나를 놓쳤습니다 <. 해야 한다:

while read BLAH ; do echo $BLAH; done < <(sysctl -a 2>/dev/null | grep '\.rp_filter')

<(sysctl -a 2>/dev/null | grep '\.rp_filter')파일이라고 생각하시면 됩니다 .

답변2

누군가 여기에 다시 오면 더 많은 옵션을 제공하십시오 ...

set -o errexit셸에 따라 명령(하위 셸 포함)이 블록에 갇히 if거나 후행 &&OR 없이 0이 아닌 값으로 종료될 때 상위 셸이 종료 되도록 할 수 있습니다 ||.

/bin/false || echo "ignoring error"

또는 kill 및 $PPID 환경 변수(사용 가능한 경우)를 사용하여 하위 쉘이 상위 쉘에 신호를 보내도록 할 수 있습니다.

또는 while 블록을 함수로 이동하고 0/1(while 블록 다음에 명시적으로 0을 반환)을 반환한 다음 like 를 사용할 수도 있습니다 sysctl | grep | function || exit. 반환 값을 인라인 블록에 넣을 수도 있지만 함수는 친구입니다. ;)

관련 정보