내 함수가 파이프의 입력으로 호출되는지 어떻게 확인할 수 있습니까?

MatrixManAtYrService

나는 보통 if [ -t 0 ]stdin을 테스트하고 if [ -t 1 ]stdin과 stdout이 TTY인지 확인하는 데 사용하며 그렇지 않은 경우 파이프라고 가정합니다. 나는 최근에 그것이 나쁜 가정이라는 것을 알게되었습니다.

function context()
{
    if [ -t 0 ]
    then
        if [ -t 1 ]
        then
            echo "no pipes"
        else
            echo "pipe out only"
        fi
    else
        if [ -t 1 ]
        then
            echo "pipe in only"
        else
            echo "pipe in and out"
        fi
    fi
}

echo "No Loop:"        # these cases work as desired
context
echo 'f' | context
echo 'f' | context | cat
context | cat

echo
echo "Loop:"
echo $'foo
bar' | while read x
do
    context             # I want this to say "no pipes"
    echo 'f' | context
done

위 bash의 출력은 다음과 같습니다.

No Loop:
no pipes
pipe in only
pipe in and out
pipe out only

Loop:
pipe in only
pipe in only
pipe in only
pipe in only

context5 번째 및 7 번째 호출이 "no pipes"를 인쇄하도록 to 의 정의를 어떻게 변경할 수 있습니까?

즉, stdin이 터미널이 아닌지 테스트하기보다 (문제를 일으키는)이 특정 함수에 대한 stdin이 파이프인지 테스트하고 싶습니다. -p이름이 지정된 파이프인지 확인하는 것을 확인했지만 익명 파이프를 위해 이것을 원합니다.

편집하다

실제 사용 사례에는 theDb대신 호출 할 함수가 포함됩니다 context. 이상적으로 아래의 두 경우는 컨텍스트에 관계없이 동일합니다.

cat file_with_some_sql | theDb
theDb "sql goes here"
agc

"파이프 인 전용" 이 네 번 나타나는 이유 는 실제로 context함수가 올바르게 작동하고 있고 echo $'foo bar' | while read x 이 파이프 이기 때문 입니다. 루프의 모든 것이 파이프 에서 while입력을 받고 있기 때문 입니다. 원하는 출력을 얻으려면 while루프를 루프로 변경하고 해당 루프에 for아무것도 파이프하지 마십시오 for.

for x in foo bar; do  context ;  echo 'f' | context; done

산출:

no pipes
pipe in only
no pipes
pipe in only

OP 코드가 어디에서 잘못되었는지 표시하려면 for루프에 무언가를 파이프하고 어떤 일이 발생하는지 확인하십시오.

echo | for x in foo bar; do  context ;  echo 'f' | context; done

산출:

pipe in only
pipe in only
pipe in only
pipe in only

초보자 while read x는 표준 입력을 모두 소비 한다고 (잘못) 생각할 수 있지만 반드시 그런 것은 아닙니다. 루프 read내부에 다음 예제를 고려하십시오 while.

printf '%s\n' foo bar baz buzz | 
while read x; do echo $x; read y; echo ${y^^} ;done

산출:

foo
BAR
baz
BUZZ

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

내 함수가 호출되고 실행되고 있는지 어떻게 확인할 수 있습니까?

분류에서Dev

함수가 chaiscript에 정의되어 있는지 어떻게 확인하고 입력 된 인수로 어떻게 실행할 수 있습니까?

분류에서Dev

루프 내부로 돌아 가기-루프 외부에 있는지 어떻게 확인할 수 있습니까?

분류에서Dev

내 프로세서가 32 비트인지 64 비트인지 어떻게 확인할 수 있습니까?

분류에서Dev

내 프로그램의 출력에 색상 (코드)이 포함되어 있는지 어떻게 테스트 할 수 있습니까?

분류에서Dev

함수에 대한 재귀 호출이 내가 생각하는 것과 같은지 어떻게 확인할 수 있습니까?

분류에서Dev

메일 내용이 인용 인쇄 가능으로 인코딩되었는지 어떻게 확인할 수 있습니까?

분류에서Dev

* 모든 * 입력 된 쉘 명령의 출력을 다른 것으로 어떻게 파이프 할 수 있습니까? (예 : 모든 것을 'lolcat'으로 파이프)

분류에서Dev

setInterval에 대한 콜백이 지정된 간격으로 정확히 호출되는지 어떻게 확인할 수 있습니까?

분류에서Dev

내 주장이 내가 확인하려는 것을 실제로 확인하는지 어떻게 확신 할 수 있습니까?

분류에서Dev

HTML 컨텐츠가 AJAX 요청에 의해 호출되는지 어떻게 확인할 수 있습니까?

분류에서Dev

내 Chrome 확장 프로그램이 새 탭 페이지에서 호출되었는지 어떻게 알 수 있습니까?

분류에서Dev

인턴 테스트 프레임 워크로 메서드가 호출되었는지 어떻게 확인할 수 있습니까?

분류에서Dev

표준 출력으로의 노드 파이프-배수되었는지 어떻게 알 수 있습니까?

분류에서Dev

내 보낸 모든 함수에 대한 정의가 dll에 포함되어 있는지 (프로그래밍 방식으로) 어떻게 확인합니까?

분류에서Dev

쉘 스크립트 내에서 systemd에 의해 호출되는지 여부를 어떻게 확인할 수 있습니까?

분류에서Dev

내 프로 시저에서 사용할 수있는 출력 옵션을 어떻게 확인합니까?

분류에서Dev

셀 내부의 요소가 확인되었는지 어떻게 검사 할 수 있습니까?

분류에서Dev

메시지 보내기 버튼의 필드가 비어 있는지 어떻게 확인할 수 있습니까?

분류에서Dev

내 데이터베이스의 열에 입력 할 확인란을 어떻게 구현할 수 있습니까?

분류에서Dev

Cython을 사용하는 C 함수의 입력 / 출력으로 파이썬 변수를 어떻게 사용할 수 있습니까?

분류에서Dev

입력 필드의 텍스트가 "예"또는 "아니오"인지 어떻게 확인할 수 있습니까?

분류에서Dev

내 constexpr 표현식이 실제로 컴파일 타임에 수행되었는지 어떻게 확인할 수 있습니까?

분류에서Dev

iterable의 요소에 무언가가 포함되어 있는지 어떻게 확인할 수 있습니까?

분류에서Dev

내 데이터의 색 공간 (RGB) 프로필을 어떻게 확인할 수 있습니까?

분류에서Dev

내 buildah 컨테이너 이미지가 Tekton Task에서 실제로 생성되었는지 어떻게 확인할 수 있습니까?

분류에서Dev

내 스크립트가 bash 또는 dash로 실행 중인지 어떻게 확인할 수 있습니까?

분류에서Dev

내 스크립트가 bash 또는 dash로 실행 중인지 어떻게 확인할 수 있습니까?

분류에서Dev

내 앱에 iCloud 데이터가 있는지 어떻게 확인할 수 있습니까?

Related 관련 기사

  1. 1

    내 함수가 호출되고 실행되고 있는지 어떻게 확인할 수 있습니까?

  2. 2

    함수가 chaiscript에 정의되어 있는지 어떻게 확인하고 입력 된 인수로 어떻게 실행할 수 있습니까?

  3. 3

    루프 내부로 돌아 가기-루프 외부에 있는지 어떻게 확인할 수 있습니까?

  4. 4

    내 프로세서가 32 비트인지 64 비트인지 어떻게 확인할 수 있습니까?

  5. 5

    내 프로그램의 출력에 색상 (코드)이 포함되어 있는지 어떻게 테스트 할 수 있습니까?

  6. 6

    함수에 대한 재귀 호출이 내가 생각하는 것과 같은지 어떻게 확인할 수 있습니까?

  7. 7

    메일 내용이 인용 인쇄 가능으로 인코딩되었는지 어떻게 확인할 수 있습니까?

  8. 8

    * 모든 * 입력 된 쉘 명령의 출력을 다른 것으로 어떻게 파이프 할 수 있습니까? (예 : 모든 것을 'lolcat'으로 파이프)

  9. 9

    setInterval에 대한 콜백이 지정된 간격으로 정확히 호출되는지 어떻게 확인할 수 있습니까?

  10. 10

    내 주장이 내가 확인하려는 것을 실제로 확인하는지 어떻게 확신 할 수 있습니까?

  11. 11

    HTML 컨텐츠가 AJAX 요청에 의해 호출되는지 어떻게 확인할 수 있습니까?

  12. 12

    내 Chrome 확장 프로그램이 새 탭 페이지에서 호출되었는지 어떻게 알 수 있습니까?

  13. 13

    인턴 테스트 프레임 워크로 메서드가 호출되었는지 어떻게 확인할 수 있습니까?

  14. 14

    표준 출력으로의 노드 파이프-배수되었는지 어떻게 알 수 있습니까?

  15. 15

    내 보낸 모든 함수에 대한 정의가 dll에 포함되어 있는지 (프로그래밍 방식으로) 어떻게 확인합니까?

  16. 16

    쉘 스크립트 내에서 systemd에 의해 호출되는지 여부를 어떻게 확인할 수 있습니까?

  17. 17

    내 프로 시저에서 사용할 수있는 출력 옵션을 어떻게 확인합니까?

  18. 18

    셀 내부의 요소가 확인되었는지 어떻게 검사 할 수 있습니까?

  19. 19

    메시지 보내기 버튼의 필드가 비어 있는지 어떻게 확인할 수 있습니까?

  20. 20

    내 데이터베이스의 열에 입력 할 확인란을 어떻게 구현할 수 있습니까?

  21. 21

    Cython을 사용하는 C 함수의 입력 / 출력으로 파이썬 변수를 어떻게 사용할 수 있습니까?

  22. 22

    입력 필드의 텍스트가 "예"또는 "아니오"인지 어떻게 확인할 수 있습니까?

  23. 23

    내 constexpr 표현식이 실제로 컴파일 타임에 수행되었는지 어떻게 확인할 수 있습니까?

  24. 24

    iterable의 요소에 무언가가 포함되어 있는지 어떻게 확인할 수 있습니까?

  25. 25

    내 데이터의 색 공간 (RGB) 프로필을 어떻게 확인할 수 있습니까?

  26. 26

    내 buildah 컨테이너 이미지가 Tekton Task에서 실제로 생성되었는지 어떻게 확인할 수 있습니까?

  27. 27

    내 스크립트가 bash 또는 dash로 실행 중인지 어떻게 확인할 수 있습니까?

  28. 28

    내 스크립트가 bash 또는 dash로 실행 중인지 어떻게 확인할 수 있습니까?

  29. 29

    내 앱에 iCloud 데이터가 있는지 어떻게 확인할 수 있습니까?

뜨겁다태그

보관