62052


bashのシェルスクリプトのなかで実行されるコマンドにEOFを明示的に渡す方法はあるでしょうか。  
具体的にやりたいことは以下になります。  
何卒よろしくお願いします。

* * *

以下のようなシェルスクリプト `test.sh` と2つのテキストファイル `txt1.txt` `txt2.txt` があります。

  * _test.sh_
[code]     #! /bin/bash

    echo "========="
    cat 
    echo "========="
    cat 
    echo "========="
    
[/code]

  * _txt1.txt_
[code]     test1

    test2
    
[/code]

  * _txt2.txt_
[code]     test3

    test4
    
[/code]

このスクリプトをターミナルで以下のように実行すると、出力は以下のようになります。

_ターミナル:_

[code]

    $ cat txt1.txt txt2.txt | ./test.sh
    =========
    test1
    test2
    test3
    test4
    =========
    =========
    
[/code]

シェルスクリプトには手を加えずに、ターミナルでのコマンド実行により以下の出力を得る方法を探しています。

[code]

    $ ???????
    =========
    test1
    test2
    =========
    test3
    test4
    =========
    
[/code]


CC BY-SA 4.0
2020-01-07T14:39:20.317
62045
2020-01-08T12:08:12.650
2020-01-07T14:55:28.550
2238
28998
question
bash
bashでコマンドの標準入力にEOFを明示的に書き込む方法


>
[code]

>     #! /bin/bash
>     echo "========="
>     cat
>     echo "========="
>     cat
>     echo "========="
>  
[/code]

このスクリプトでは、最初の`cat`でEOFが検出された後、次の`cat`でも即座にEOFが検出されるので、スクリプトを修正しないと要望されていることはできないと思います。


CC BY-SA 4.0
2020-01-08T02:48:01.537
62052
2020-01-08T04:25:51.937
2020-01-08T04:25:51.937
19110
35558
62045
answer


既に解決？済みなので参考までに。

承認済回答のコメント欄に書きましたが、FIFO(named pipe) を使います。

**fake_eof.sh**

[code]

    #!/bin/bash
    
    exec 2>/dev/null
    ./test.sh < fifo &
    cat txt1.txt > fifo
    dd if=/dev/null of=fifo bs=1 count=1
    cat txt2.txt > fifo
    
[/code]

FIFO ファイルを作成して(`mkfifo fifo`)、`./fake_eof.sh` を実行すると、 **環境によっては**
質問欄にある様な出力になります。要は FIFO(named pipe) に対する read/write
のタイミング次第ですので、同じ環境でも実行毎に結果が異なる場合もあり得ます。

この「FIFO に対する read/write
のタイミング」については(興味があれば)[こちらの質問](https://ja.stackoverflow.com/questions/23686/)を参照して見て下さい。また、[Pipes
and FIFOs (The GNU C
Library)](https://www.gnu.org/software/libc/manual/html_node/Pipes-and-
FIFOs.html) も参考になるかと思います。


CC BY-SA 4.0
2020-01-08T12:08:12.650
62072
2020-01-08T12:08:12.650
62045
answer