![<と>を使用してシェルで同じファイルを上書きする方法は? [コピー]](https://linux33.com/image/195828/%26lt%3B%E3%81%A8%26gt%3B%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%A7%E5%90%8C%E3%81%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%B8%8A%E6%9B%B8%E3%81%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
これによりmy_script < filename.txt > filename.txt
ファイルが上書きされ、切り捨てられます。
リダイレクトを指定する方法はUnixコマンドラインにありますか?いいえ同時に完了、つまり入力が完了した後に出力が開始されますか?
ファイルを読み込み、コマンドラインオプションに従ってファイルを再生成して上書きするユーティリティを作成しようとしています。プログラムにサポートを追加できることに気づきました。いいえstdin/stdoutを使用していますが、リダイレクトの柔軟性と利便性が気に入っています。
答え1
次のことができます。
(rm -f foo && yourprogram > foo) < foo
たとえば、
(rm -f foo && wc > foo) < foo
読み取り用に開きますfoo
。次に、サブシェルを起動し、ファイルをfoo
開いたままiノードを削除します。最後foo
に出力を開きますfoo
。
ディレクトリへの書き込み権限が必要なので、ファイルへの書き込み権限しかないと幸運ではありません。
iノードが変更されるので(権限、所有者、ctimeがすべて失われます)、名前だけが重要であれば問題ありません。
対照的に、sponge
出力がメモリより大きい場合でもyourprogram
機能します。
答え2
ここでは、ファイルを文字列バッファに読み込み、同じファイルを上書きできます(シェル bash)。
my_script <<<$(<filename.txt) >filename.txt