猫のコマンドとエコー


14

echoの出力をファイルの内容と連結したいのですが。私は次のコマンドを試しました:

echo "abc" | cat 1.txt > 2.txt

ただし、2.txtファイルにはのコンテンツのみが含まれています1.txt。なぜ機能しないのですか?


3
catファイル名引数がない場合、標準入力からのみ読み取るようなプログラム。
Barmar

回答:


23

catパイプシーケンスecho内のプログラムがプログラムの出力を標準入力から読み取るように指示されていないため、機能しません。

-への標準入力を示す疑似ファイル名として使用できますcatman catmsys2のインストールに:

EXAMPLES
       cat f - g
              Output f's contents, then standard input, then g's contents.

だから試して

echo "abc" | cat - 1.txt > 2.txt

代わりに。


21

他の人が指摘しているように、元のコマンドはcat 1.txt標準入力を無視するため失敗します。最初の引数(cat - 1.txt)である必要があることを示すか、ブロックリダイレクトを使用してリダイレクトecho abc して cat 1.txt一緒にします。ウィットするには:

{ echo abc; cat 1.txt; } > 2.txt 

マニュアルからの関連抜粋(man bash):

複合コマンド
複合コマンドは次のいずれかです。ほとんどの場合、コマンドの説明のリストは、コマンドの残りの部分から1つ以上の改行で区切られ、セミコロンの代わりに改行が続く場合があります。

(リスト)

    listはサブシェル環境で実行されます(以下のコマンド実行環境を参照)。シェルの環境に影響を与える変数の割り当てと組み込みコマンドは、コマンドの完了後も有効になりません。返却ステータスはリストの終了ステータスです。

{リスト; }

    listは、現在のシェル環境で単純に実行されます。  リストは改行またはセミコロンで終了する必要があります。これは、グループコマンドと呼ばれます。戻りステータスはlistの終了ステータスです。メタ文字(とは異なり){および}予約語であり、予約語の認識が許可されている場所で発生する必要があることに注意してください。それらは単語の区切りを引き起こさないため、 空白または別のシェルメタ文字によってリストから分離する必要があります。

最初のオプション(サブシェル環境)には多くの副作用がありますが、すべてではないにしても、ほとんどはシナリオに関係ありません。ただし、一連のコマンドの出力をリダイレクトするだけでよい場合は、ここでのオプション#2(グループコマンド)が推奨されます。


7
( echo "abc"; cat 1.txt ) > 2.txt

エコー出力をcatにパイプしましたが、catは入力を使用しなかったため無視しました。コマンドが次々に実行され、それらの出力がグループ化され(括弧)、2.txtに送信されます。


1
この答えはそれがどのように機能する、およびOPの元の試みが機能しない理由を説明することで改善できます。
ボブ

はい、試してみました。
Gerard H. Pille、2018年

5
ここではサブシェルは明示的に必要ではありません。おそらく、グループコマンドを使用する方が良いでしょう。詳細については、私の回答を参照してください。
Nubarke 2018年

ああ、でもbashは使いません。
Gerard H. Pille、2018年

1
@ GerardH.Pille:Danielの回答はから引用していますがbash(1)、すべてのPOSIX準拠シェルがサポートする必要のある動作を説明しています。
G-Manが 'Reinstate Monica'

2

コマンドcat 1.txtは、の出力では何もしませんecho "abc"

代わりに: (echo "abc"; cat 1.txt) > 2.txt 両方のコマンドの出力を2.txtに書き込みます。


この回答は、提案された代替案がどのように機能するかを説明することで改善できます。
ボブ

1

どのPOSIXシェルでも、コマンド置換を使用してcat file、の入力として使用できますecho

echo $(cat file1.txt) "This Too"

Bashでは、次のように、プロセス置換を使用し、の別の「ファイル」としてechoを使用できますcat

cat file1.txt <(echo This Too)

そして、適切と思われる出力をパイプまたはリダイレクトします。

他のすべての答えが言うように、猫はそれが見るファイルを持っているならstdinを無視します。(私はダニエルとmvwの答えも好きです、彼らのために+1)


1
この答えは、OPの元の試みが機能しない理由を説明することで改善できます(したがって、代わりにこれが必要な理由)。
ボブ

1
<(command)建設は、bashの拡張機能です。これはPOSIXではないため、で実行されることになっているスクリプトでこれに依存することはできません/bin/sh
Rhialtoは2018

0

推測ではありますが、繰り返し可能なプロセスがあるように見えます。これは、エイリアスまたは関数の適切な候補です。エイリアスは通常、単一の入力ストリームを引数として、略語などのbashコマンドを呼び出すためのショートカットです。

alias hg="history | grep"

ただし、この場合、複数の離散(2)入力ストリームと複数のbashコマンドを組み合わせているため、関数の方が読みやすくなります。2つの引数があります。1つは文字列、もう1つはファイルパスです。最後に、結果をstdout出力ストリームに書き込む必要があります。

CLIプロンプトから、次のように入力します。

# ecat()        
{
echo ${1}
cat ${2}
}

関数の名前はecatで、覚えやすいです。

これで次のように呼び出すことができます

ecat "abc" 1.txt

追加するには、stdoutに別の出力先を指定するだけです。

ecat "abc" 1.txt >> 2.txt

追加リダイレクト演算子 '>>'は、指定されたファイルの最後に出力を追加します。

気に入ったら、〜/ .bashrcファイルに追加して再利用します。

declare -f ecat >> ~/.bashrc

つまり、関数定義内で装飾などを行うことができます。

これを〜/ .bashrcに追加して、ファイルが上書きされないように保護することもお勧めします

set noclobber

2
関数を正しく動作させるには、"$1"およびを使用する必要があり"$2"ます。この文脈では、中括弧は何の役にも立ちません。See ${name}は、あなたが考えていることを意味するわけではありません…
G-Manが 'Reinstate Monica'

1
noclobber提案は、目の前の質問にどのように反応しますか?(また、それが良いアドバイスであることにも非常に確信がありません。グローバルな動作を変更すると、デフォルトを念頭に置いて構築されたスクリプト/アドバイス/実践が壊れる傾向があります)。
Charles Duffy

0

次のコードも機能します。

echo abc >> 1.txt && cat 1.txt > 2.txt

出力 エコーABCはと1.TXTに追加されます>> その後&&コマンド意志の次のセットを実行するためにそれを教えてくれる猫1.TXTし、その後にそれを出力2.txtを。基本的に、最初のコマンドの出力を1.txtに追加し、1.txtの出力を2.txtに送信します。

abcを最初に表示する場合は、次のコードを使用できます。

echo abc >> 2.txt && cat 1.txt >> 2.txt

1
これは(1)abc下部に配置され2.txtます。質問はそれを一番上に望んでいます。(2)  ファイルを変更1.txtます。これは受け入れがたい。
G-Manは 'Reinstate Monica'を

それはどこにそれを言うのですか?Ringger81は、2.txtのどこにabcを表示するかを指定していません。あなたは、質問が決して述べないことを想定しています。
Nasir Riley、

(1)OK、あなたは#1で有効なポイントを上げます。質問では、テキストの「ファイルのコンテンツ」の前に「エコーからの出力」について言及し、サンプルコマンドのecho前に「を」を付けていますが、cat正確に、明示的言うと、エコーの前にエコーからの出力が必要であるとは言いません。入力ファイルの内容。ほとんどの人がそのように解釈したようです。(2)  1.txtは入力ファイルです。質問は、変更については何も述べていません1.txt。入力ファイルを変更してはならないことは言うまでもありません。
G-Manが 'Reinstate Monica'

imputファイルを変更しないという点について理解できました。私の2番目のコードは、そうしなくても望ましい効果を達成します。
Nasir Riley、

1
ファイルを開く、追加する、閉じる、再度開く、再度追加する...一度だけ開いて、両方の操作でリダイレクトを維持するのではなく、なぜそれを行うのですか?
Charles Duffy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.