使用すると、echo 1234 >> some-file
文書に出力が追加されることが示されています。
私の考えでは、some-fileが存在しない場合、O_CREATは新しいファイルを生成します。使用される場合、>
O_TRUNC は既存のファイルを切り捨てます。
場合>>
:ファイルがO_WRONLY(またはO_RDWR)で開き、O_APPENDをシミュレートして書き込み操作を終了して完了しようとしましたか?それともファイルがO_APPENDで開かれ、カーネルが追加が発生するかどうかを確認しますか?
出力ファイルがNFSマウントポイントから出ると、コンソールプロセスはechoによって挿入されたいくつかのタグを上書きし、NFS文書によると、O_APPENDはサーバーでサポートされていないため、クライアントカーネルがそれを処理する必要があるため、この質問をします。保存プロセスはO_APPENDを使用しているようですが、>>
Linuxのbashについてはよくわからないので、ここで質問します。
答え1
私はこれを実行しました:strace -o spork.out bash -c "echo 1234 >> some-file"
あなたの問題を特定するために。これが私が見つけたものです:
open("some-file", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
コマンドを実行しているディレクトリに「some-file」というファイルはありませんecho
。
答え2
これはBashで行われるだけでなく、標準でも必要です。
追加の出力リダイレクトを使用すると、単語の拡張により、名前付きファイルが指定されたファイル記述子で出力用に開かれます。ファイルは次のように開きます。開いている()POSIX.1-2008システムインタフェースボリュームで定義されている関数は、O_APPENDフラグを使用して呼び出されます。ファイルがない場合は作成する必要があります。
したがって、POSIX準拠のシェルではこれを行う必要があります。/bin/sh
POSIX以外のBourneシェル(Bourneシェルは、もともとBourneシェルが最初に発明される前に作成されたもの)など、一部のUnixシステムでO_APPEND
使用可能なPOSIXシェルは通常、別のパスの場所(Solarisなど)にksh
あります。sh
/usr/xpg4/bin
答え3
ソースコードを見るとO_APPENDを使用しています。 Bash 4.3.30の場合、make_cmd.c
行710-713:
case r_appending_to: /* >>foo */
case r_append_err_and_out: /* &>> filename */
temp->flags = O_APPEND | O_WRONLY | O_CREAT;
break;
答え4
strace
NFSではなくローカルファイルシステムでの使用方法を見てみましょう。
$ strace -eopen -- bash -c "echo foo >> /tmp/testfile000" 2>&1 | grep /tmp/testfile000
open("/tmp/testfile000", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
$ strace -eopen -- bash -c "echo foo > /tmp/testfile000" 2>&1 | grep /tmp/testfile000
open("/tmp/testfile000", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
他のシェル、つまりbusyboxの、、、およびdash
はdash
同じように動作します。sh
mksh
このオプションは、システムコールのみを追跡することを-e open
示します。-e trace=open
open()