回答:
他の人が指摘しているように、元のコマンドは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(グループコマンド)が推奨されます。
( echo "abc"; cat 1.txt ) > 2.txt
エコー出力をcatにパイプしましたが、catは入力を使用しなかったため無視しました。コマンドが次々に実行され、それらの出力がグループ化され(括弧)、2.txtに送信されます。
どのPOSIXシェルでも、コマンド置換を使用してcat file、の入力として使用できますecho。
echo $(cat file1.txt) "This Too"
Bashでは、次のように、プロセス置換を使用し、の別の「ファイル」としてechoを使用できますcat。
cat file1.txt <(echo This Too)
そして、適切と思われる出力をパイプまたはリダイレクトします。
他のすべての答えが言うように、猫はそれが見るファイルを持っているならstdinを無視します。(私はダニエルとmvwの答えも好きです、彼らのために+1)
<(command)建設は、bashの拡張機能です。これはPOSIXではないため、で実行されることになっているスクリプトでこれに依存することはできません/bin/sh。
推測ではありますが、繰り返し可能なプロセスがあるように見えます。これは、エイリアスまたは関数の適切な候補です。エイリアスは通常、単一の入力ストリームを引数として、略語などの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
"$1"およびを使用する必要があり"$2"ます。この文脈では、中括弧は何の役にも立ちません。See ${name}は、あなたが考えていることを意味するわけではありません…。
noclobber提案は、目の前の質問にどのように反応しますか?(また、それが良いアドバイスであることにも非常に確信がありません。グローバルな動作を変更すると、デフォルトを念頭に置いて構築されたスクリプト/アドバイス/実践が壊れる傾向があります)。
次のコードも機能します。
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
abcの下部に配置され2.txtます。質問はそれを一番上に望んでいます。(2) ファイルを変更し1.txtます。これは受け入れがたい。
echo前に「を」を付けていますが、cat正確に、明示的に言うと、エコーの前にエコーからの出力が必要であるとは言いません。入力ファイルの内容。ほとんどの人がそのように解釈したようです。(2) 1.txtは入力ファイルです。質問は、変更については何も述べていません1.txt。入力ファイルを変更してはならないことは言うまでもありません。
catファイル名引数がない場合、標準入力からのみ読み取るようなプログラム。