私はしばしばスクリプトを実行し、ここにSTDINの数行を入力する必要があります。これを行うときは通常、通話を準備してから、1つの端末ウィンドウから別の端末ウィンドウにコピーして貼り付けます。理想的には、次のようなテキストブロックを貼り付けることができることを願っています。
<script name> <script args>
<STDIN line 1>
<STDIN line 2>
...
次にCtrl-dを押して、STDINが入力の終わりに達したことをスクリプトに表示します。
bashで(単一貼り付けとして)これを行うと、セッションでSTDINエコーなしでスクリプトが実行され、<cr>
^ dが処理される前に追加の項目がヒットされ、スクリプトSTDINの最初の行が失われます。そのため、通常、スクリプト呼び出しを自己貼り付けとして貼り付けてから、STDINのすべての行を2番目の貼り付けとして貼り付けます。これにより、行を貼り付けてエコーでき、Ctrl-dを押して入力の終わりを示します。
zshでこれを行うと、ほとんどのSTDIN行はエコーされません(STDIN行が多い場合は最後の行の一部がエコーされ、最初の行は行の末尾の部分だけをエコーできます)。 、<cr>
^d の前に追加の必要性を識別した後。
問題のスクリプトがPythonかPerlかは問題ではありません。どちらも同じように動作するので、これがシェルの問題であると信じています。
問題は、問題がどこにあり、各実行を単一の貼り付けで実行できるソリューションがありますか?
実行されるスクリプトの内容は実際には重要ではありません。私のテストでは、whileループと同じ単純なスクリプトを使用してSTDINを1行ずつバッファに読み込み、whileループの外側にバッファを印刷しました。私が言うのは、<cr>
キーボードのキーに応じてEnterまたはReturnキーです。
ベストアンサー1
heredocを試してみてください。切り取り、貼り付けが簡単です。
script.sh arg arg arg <<'END_INPUT'
line1
line2
line3
END_INPUT