ディレクトリを作成する場合、mkdir -m <mode> <dir>
は、指定されたモード/権限セットを(原子的に)1つ以上のディレクトリを作成するために提供されます。
コマンドラインでファイルを作成するための同等のものはありますか?
次のようなもの:
open("file", O_WRONLY | O_APPEND | O_CREAT, 0777);
ここでtouch
の後にchmod
を使用するのが私の唯一のオプションですか?
編集:install
を使用するというteppicの提案を試した後、strace
を実行して、アトミックにどれだけ近いかを確認しました。答えは、それほどではありません。
$ strace install -m 777 /dev/null newfile
...
open("newfile", O_WRONLY|O_CREAT|O_EXCL, 0666) = 4
fstat(4, {st_mode=S_IFREG|0666, st_size=0, ...}) = 0
...
fchmod(4, 0600) = 0
close(4) = 0
...
chmod("newfile", 0777) = 0
...
それでも、これは単一のシェルコマンドで、以前は知らなかったものです。
install
コマンド(GNU coreutils)の一部)をダミーファイルで使用できます。
install -b -m 755 /dev/null newfile
-b
オプションは、すでに存在する場合はnewfile
をバックアップします。このコマンドを使用して、所有者を設定することもできます。
touch
は、ファイルが存在しない場合は常に作成し、常にシンボリックリンクをたどり、常にファイルを実行不可にします。 mask を使用して、読み取りビットと書き込みビットを決定できます。
(umask 077; touch file) # creates a 600 (rw-------) file
(umask 002; touch file) # creates a 664 (rw-rw-r--) file
「安全な」アトミックファイルの作成(特にO_NOFOLLOW
を使用)は、従来のシェルツールでは不可能です。 Perlではsysopen
を使用できます。 BSD風のmktemp
ユーティリティがある場合、O_NOFOLLOW
でアトミックにファイルを作成します。デフォルトモードの600が適切でない場合は、後でchmod
を呼び出す必要があります。
@teppicの答えに基づいて、コンテンツとモードを同時に持つファイルを作成したい場合(bash):
_install -m 755 <(echo commands go here) newscript
_
<()
は、出力を一時ファイルに配置します。 Process-Substitution を参照してください。