2009-03-11 6 views
4

나는 나의 ksh 스크립트는 다른 동작 표준 입력 여부를 통해 들어오는 무언가가 있는지 여부에 따라 갖고 싶어 :이 단자가 있는지 확인하기 위해 표준 입력에 대한 확인ksh : 표준 입력을 검사하는 방법?

(1) cat file.txt | ./script.ksh (then do "cat <&0 >./tmp.dat" and process tmp.dat) 
vs. (2) ./script.ksh (then process $1 which must be a readable regular file) 

을 [-t 0] 때문에, 도움이되지 않습니다 내 스크립트는 다른 스크립트에서 호출됩니다.

stdin이 "비어 있음"(두 번째 경우) 인 경우 "cat < & 0> ./ tmp.dat"를 실행하면 tmp.dat의 크기를 확인하여 EOF를 기다리는 중 전화가 끊깁니다.

stdin이 "비어 있는지"확인하는 방법은 무엇입니까?!

+0

인수의 길이를 확인하는 방법은 무엇입니까? ($ #) $ 1이 있으면 그걸 읽는 것으로 결론을 내립니다. 그렇지 않다면 stdin에서 읽어야합니다. –

+0

내가 할 수만 있다면! 사용법 : ./script.ksh <-d dest> [-f from_sys] [file, file1, ..]. stdin => [file, file1, ..]이 처리되지 않으면 방금 이동했습니다. stdin => 프로세스 파일이 없으면 file1을 이동하십시오. 표준 입력이 없거나 [file, file1, ..] => 오류가 발생하지 않으면 사용자가 처리해야합니다! –

+0

ExpertNoob,이 질문에 답변으로 표시 할 수 있습니다. :) – vladr

답변

3

편집 : 당신은 HP-UX에서 HP-UX에 [ -t 0 ]을 테스트

을 실행하고 나를 위해 일하게 될 것으로 보인다.

/tmp/x.ksh:

#!/bin/ksh 
/tmp/y.ksh 

/tmp/y.ksh:

#!/bin/ksh 
test -t 0 && echo "terminal!" 

/tmp/x.ksh 인쇄 실행 : 나는 다음과 같은 설정을 사용한 플랫폼에 위의 terminal!

당신이 확인 수를, 및/또는 제공 귀하의 상황을보다 자세히 반영한 대체 시험 배치? 스크립트가 궁극적으로 cron에 의해 생성됩니까?


편집 2

필사적하면 , 펄 사용할 수있는 경우, 정의

stdin_ready() { 
    TIMEOUT=$1; shift 
    perl -e ' 
    my $rin = ""; 
    vec($rin,fileno(STDIN),1) = 1; 
    select($rout=$rin, undef, undef, '$TIMEOUT') < 1 && exit 1; 
    ' 
} 

stdin_ready 1 || 'stdin not ready in 1 second, assuming terminal' 

EDIT를 3

유의하시기 바랍니다 제한 시간이 수 중요 할 필요가있다. 입력이 sort, ssh 등인 경우 (이 모든 프로그램은 데이터를 생성하기 전에 스크립트를 사용하여 초 또는 분으로 파이프를 생성하고 설정할 수 있습니다.) 무거운 시간 초과를 사용하면 아무 것도 없을 때 스크립트가 크게 저하 될 수 있습니다 입력은 (예. 터미널).

잠재적으로 큰 시간 초과가 문제가되고 스크립트가 호출되는 방식에 영향을 줄 수있는 경우 표준 입력 장치를 통해 발신자가 프로그램을 사용해야하는지 프로그램에 명시 적으로 지시해야 할 수 있습니다. 사용자 정의 옵션 또는 표준 GNU 또는 tar 방식 (예 : script [options [-]] FILE ... FILE은 파일 이름, 표준 입력을 나타내는 - 또는 이들의 조합 일 수 있으며 스크립트는 -이 매개 변수로 전달 된 경우 표준 입력에서 읽음)

+0

HP-UX :-( HP-UX에서 기존 파이프를 표시 할 수 있습니까? –

+0

Hmmm, 'test -t 0'은 fp를 hpux의 터미널로 올바르게 식별합니다. 테스트는 다른 스크립트 (HP-UX HP-A500 B.11.11 U 9000/800 538790518 무제한 사용자 라이센스)가 호출하는 스크립트 내에서 수행됩니다. – vladr

+0

글쎄, 테스트 -t 0은 테스트에서도 작동하지만 스크립트는 호출됩니다. 수십 가지에 이르기까지 일부는 파일 설명자가있는 검은 마법을 수행해야합니다 .. 내 스크립트는 전 세계 여러 서버에서 기존 스크립트를 대체하므로 총알이 필요합니다. 펄 솔루션은 훌륭합니다. 지금 테스트 중입니다. 고마워요! –

0

더 일반적인 방법으로이 문제를 해결하고 명령 줄 인수를 사용하여 데이터가 표준 입력에서 오는 것일 수 있습니다.예를 들어

는 차이 고려 :

echo foo | cat -

echo foo > /tmp/test.txt

cat /tmp/test.txt

2

이 전략 bash는 작동을하고, KSH에 대한 가능성을 작동합니다. 설문 조사 'tty':

#!/bin/bash 
set -a 

if [ "$(tty)" == 'not a tty' ] 
then 
    STDIN_DATA_PRESENT=1 
else 
    STDIN_DATA_PRESENT=0 
fi 

if [ ${STDIN_DATA_PRESENT} -eq 1 ] 
then 
    echo "Input was found." 
else 
    echo "Input was not found." 
fi 
+0

또한 ksh와 함께 작동합니다. – Boune

+2

영어가 아닌 시스템에서는 "not a tty"의 현지화 된 버전을 사용하지 마십시오. 이 문제를 피할 수있는 가능성 중 하나는 스크립트 상단에 "LANG = C"줄을 추가하는 것입니다. – chiborg

관련 문제