2014-08-29 2 views
1

내가 할 경우, 다음첫 번째 반복 후 왜 멈 춥니 까?

tr -cd 'a-z' < /dev/urandom | fold -w10 | head -n40 > pw 
for f in $(seq -w 40); do echo linux$f.example.com;done > hosts 

while read -r x && read -r y <&3; do ssh $x -l root echo $y;done <hosts 3<pw 

다음 루프가 첫 번째 반복 후 중지,하지만 난 (내가 원하는하지 않은)을 echo를 삽입하면 다음 모두 40

while read -r x && read -r y <&3; do echo ssh $x -l root echo $y;done <hosts 3<pw 
을 통해 루프

질문

먼저 임시 파일을 만들지 않고도 40 개의 반복을 모두 실행할 수 있습니까?

+0

어쩌면 작동하지 않기 때문에 어떻게해야하는지 알려줄 수 있습니다! –

+1

'ssh'가 fds를 훔쳐 읽고/플러시하는지 궁금합니다. 'ssh' 명령에 대해 stdin과'& 3'을 닫으시겠습니까? –

+0

@EtanReisner'/dev/null'을 추가하면 문제가 해결되었습니다. 감사합니다.) –

답변

1

ssh이 (가) 귀하의 fds를보고 배수하고있는 것으로 보입니다.

실행할 때 fds를 ssh (으)로 닫습니다.

1

어떻게 ...

#!/bin/bash 
h=1 
LC_CTYPE="C" tr -cd 'a-z' < /dev/urandom | fold -w10 | head -n40 | \ 
    while read x; do 
     host=$(printf "linux%02d.example.com" $h) 
     echo $x $host 
     ((h++)) 
    done 
임시 파일을 피하는 또 다른 방법은 당신이 필요로하는 두 개의 입력을 생성 한 다음 읽기 전에 별도의 행에 쌍으로 붙여 과정 대체를 사용하는 것입니다

임시 파일을 피하는 이것에 대해 모두 같은 하나의 루프 :

#!/bin/bash 
paste \ 
    <(LC_CTYPE="C" tr -cd 'a-z' < /dev/urandom | fold -w10)  \ 
    <(for f in $(seq -w 40); do echo linux$f.example.com;done) | \ 
    head -n40 | while read x y; do 
     echo $x $y 
    done 

아니면 서브 쉘 내부 변수에 대한 걱정이 있다면 당신은 주위를 다른 방법으로 작업을 수행 할 수 있습니다

#!/bin/bash 
while read x y; do 
    echo $x $y 
done < <(paste \ 
      <(LC_CTYPE="C" tr -cd 'a-z' < /dev/urandom | fold -w10)  \ 
      <(for f in $(seq -w 40); do echo linux$f.example.com;done) | \ 
      head -n40) 
+0

파이프를 사용하여 암시 된 하위 쉘은 'h'카운터가 올바르게 작동하지 않게합니다. –

+0

@EtanReisner 감사합니다. 아침에 확인하겠습니다. 비록 Mac에서 실행했지만 정확한 것으로 보입니다. –

+0

@EtanReisner 내 컴퓨터에서 제대로 실행되는 것 같습니다. 하나의 서브 쉘이 관련되어 있고, 그것은'while' 루프를 처리합니다. 부모가 시작될 때 부모로부터'h'를 물려받은 다음 매회 루프를 통해 유쾌하게 증가시킵니다. 나는 어떤 문제도 볼 수 없다 - 당신이 의미하는 바를 설명 할 수 있겠습니까? –

관련 문제