하위 쉘을 생성하거나 임시 파일을 사용하지 않고 명령 출력을 반복하고 싶습니다.
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
. 반환 값을 인라인 블록에 넣을 수도 있지만 함수는 친구입니다. ;)