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


9

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

내 스크립트의 초기 버전은 다음과 같았습니다. 그러나 서브 쉘을 작성하므로 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')

해당 명령의 출력을 임시 파일로 저장하고 임시 파일에서 리디렉션을 사용할 수는 있지만 그렇게하지 않으려 고했습니다.

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


답변:


13

보고 싶었습니다 <. 해야한다:

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

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


고마워 나의 교리를 위해서, 이것을 문서화하는 맨 페이지, 도움말 또는 웹 페이지를 가리킬 수 있습니까? 검색하려고 할 때 유용한 정보를 Google에 알려주지 못했습니다.
Zoredache

2
구글 "프로세스 대체". 예 : tldp.org/LDP/abs/html/abs-guide.html#PROCESS-SUB
dogbane

<() 대체는 파일 디스크립터를 사용하며 일부 운영 체제에서는 임시 파일을 투명하게 작성하고 사용합니다.
ewindisch

@Zoredache : <(bash 매뉴얼에서 간단히 검색 하십시오 ( "프로세스 대체"아래에 있음).
Gilles 'SO- 악마 그만해'

@ewindisch, 도구가 투명한 임시 파일을 투명하게 만들면 필요하지 않다고 확신 할 때 수동으로 직접 임시 파일을 만들고 싶지 않았습니다.
Zoredache

0

누군가가 여기에 다시 오면 몇 가지 대안이 더 있습니다 ...

쉘에 따라, 당신은 아마 사용할 수 있습니다 set -o errexit(서브 쉘 포함) 명령이에 갇혀되지 않고 0이 아닌 종료 할 때 부모 쉘 출구를 가지고 if블록 또는 후행 &&또는 ||같이,

/bin/false || echo "ignoring error"

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

또는 while 블록을 함수로 이동하고 0/1을 반환하고 (while 블록 뒤에 0을 명시 적으로 반환) 파이프 라인을 다음과 같이 수행하면 sysctl | grep | function || exit됩니다. 인라인 블록에 반환을 넣을 수 있다고 가정하지만 함수는 친구입니다. ;)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.