8

ファイルの内容を stdin に置く一般的な方法は次のとおりです。

./command.sh < myfile

これにより、myfile のすべての内容が stdin に配置され、eof も送信されます。EOFを追加せずに内容をstdinに入れたい。

さまざまな対話型プログラムについて、一連のコマンドでプログラムを開始したいのですが、その後もプログラムとの対話を続けます。eof が送信されない場合、プログラムは次の入力を待機し、それを対話的に入力できます。

これはbashで可能ですか?私の現在の解決策は、内容をクリップボードに投げてから貼り付けることです。これを行うより良い方法はありますか?

4

3 に答える 3

4

cat次のコマンドを使用して、ファイルをstdinとマージするだけです。

./command.sh < <(cat myfile -)

また

cat myfile - | ./command.sh

cat指図

catcon cat enateの略:

man cat
NAME
       cat - concatenate files and print on the standard output

SYNOPSIS
       cat [OPTION]... [FILE]...

DESCRIPTION
       Concatenate FILE(s), or standard input, to standard output.
...

F ine Manual読んでください;-)

あなたは書くことができます

cat file1 file2 file3 ... fileN

と同様

cat file1 - file2

cat - file1

cat file1 -

必要に応じて...

ファイルの代わりにヒアドキュメントとヒアストリングを使用した複雑なサンプル

ヒアドキュメントの末尾の改行削除head -c -1するために使用します。commandは、コマンドを1ずつ処理することをシミュレートします。sed

sed 's/.*/[&]/' < <(cat <(head -c -1 <<eof 
Here is some text, followed by an empty line

Then a string, on THIS line: 
eof
) - <<<'Hello world')

出力する必要があります:

[Here is some text, followed by an empty line]
[]
[Then a string, on THIS line: Hello world]
于 2012-12-30T01:12:04.943 に答える
2

これに対する解決策はを使用することです。

test -p /tmp/fifo || mkfifo /tmp/fifo

while true; do
    read line < /tmp/fifo
    echo "$line"
    [[ $line == break ]] && $line
done

とフィードするfifo

echo foobar > /tmp/fifo

「リスニング」を停止するには:

echo break > /tmp/fifo

見るman mkfifo

于 2012-12-29T23:19:04.773 に答える
2

もう 1 つの方法は、別のスクリプトを使用して入力を与えることです。

inputer.sh:

cat $1
while read line; do
  echo $line
done

Usage:

sh inputer.sh input_file | sh your-script.sh
于 2012-12-29T23:32:15.247 に答える