14

>>具体的には、カスタム エイリアスでとの組み合わせを使用して、tee新しい Homebrew の更新をテキスト ファイルに保存し、画面に出力しています。

alias bu="echo `date "+%Y-%m-%d at %H:%M"` \
    >> ~/Documents/Homebrew\ Updates.txt && \
    brew update | tee -a ~/Documents/Homebrew\ Updates.txt"

質問: この出力をテキスト ファイルの先頭に追加したい場合、つまり、ファイルの末尾ではなく先頭に追加したい場合はどうすればよいですか?


Edit1 :誰かが以下の回答で報告したように、一時ファイルの使用は良いアプローチかもしれません。これは少なくとも部分的に私を助けました:

targetLog="~/Documents/Homebrew\ Updates.txt"
alias bu="(brew update | cat - $targetLog \
> /tmp/out1 && mv /tmp/out1 $targetLog \
&& echo `date "+%Y-%m-%d at %H:%M":%S` | \
cat - $targetLog > /tmp/out2 \
&& mv /tmp/out2 $targetLog)"

しかし、問題は STDOUT への出力 (以前は tee によって可能だった) であり、この一時ファイルのアプローチに組み込むことができるかどうかはわかりません…?

4

6 に答える 6

8

これは、出力ファイルを作成することで機能します。

file.txt に初期コンテンツがあるとしましょう

echo "first line" > file.txt          
echo "second line" >> file.txt

したがって、file.txt は「一番下」のテキスト ファイルです。新しい「出力」ファイルに追加します

echo "add new first line" | cat - file.txt > output.txt # <--- Just this command

これで、出力の内容が希望どおりになりました。旧姓が必要な場合:

mv output.txt file.txt
cat file.txt
于 2014-07-22T16:10:38.667 に答える
5

bash ツールを使用して入力ファイルを変更する唯一の簡単で安全な方法は、一時ファイルを使用することです。sed -i舞台裏で一時ファイルを使用します(ただし、堅牢にするためにsedはもっと必要です)。

実際のデータ ファイルに対してコマンドを実行するのではなく、 (変更しようとしているファイルへの)シンボリック リンクに対してコマンドを実行すると、使用されるメソッドの一部には微妙な「問題が発生する可能性がある」トラップがあります。正しく対応しない限り、これによりリンクが壊れて実際のファイルに変換され、mod を受け取り、意図した mod とシンボリックリンクなしで 元の実際のファイルが残る可能性があります (エラー終了コードの結果はありません)。

でこれを回避するには、 オプションsedを使用する必要があり--follow-symlinksます。
他の方法については、シンボリックリンクをたどる必要があることに注意してください(そのようなリンクを操作する場合)
一時ファイルを使用すると、rm temp file「ファイル」がシンボリックリンクでない場合にのみ機能します。

安全な方法の 1 つはsponge、パッケージmoreutilsから使用することです。

シェルのリダイレクトとは異なり、スポンジは出力ファイルを開く前にすべての入力を吸収します。これにより、同じファイルから読み書きするパイプラインを構築できます。

spongeこの種の状況を処理する一般的な方法としては、 が適しています。

使用例を次に示します。sponge

hbu=~/'Documents/Homebrew Updates.txt'
{ date "+%Y-%m-%d at %H:%M"; cat "$hbu"; } | sponge "$hbu"
于 2011-10-18T13:50:49.650 に答える
2

IMO で echo と cat を使用する最も簡単な方法:

echo "Prepend" | cat - inputfile > outputfile

またはあなたの例では、基本的tee -a ~/Documents/Homebrew\ Updates.txtcat - ~/Documents/Homebrew\ Updates.txt > ~/Documents/Homebrew\ Updates.txt

編集: hasturkun が述べたように、これは機能しません。試してください:

echo "Prepend" | cat - file | tee file

しかし、これはもはや最も効率的な方法ではありません...

于 2011-10-18T12:30:58.843 に答える
1
{ date; brew update |tee /dev/tty; cat updates.txt; } >updates.txt.new
mv updates.txt.new updates.txt

なぜあなたがこれをしたいのか分かりません。このようなログでは、ファイルの後半にエントリが表示されるのはかなり標準的です。

于 2011-10-18T20:48:39.797 に答える