GNU/Linux >> Linux の 問題 >  >> Linux

アトミック作成ファイルが存在しない場合は、bash スクリプトから

ランダムに生成された名前で作成し、名前を変更できます (mv -n random desired ) 目的の名前の場所に配置します。ファイルが既に存在する場合、名前の変更は失敗します。

このように:

#!/bin/bash

touch randomFileName
mv -n randomFileName lockFile

if [ -e randomFileName ] ; then
    echo "Failed to acquired lock"
else
    echo "Acquired lock"
fi

100% 純粋な bash ソリューション:

set -o noclobber
{ > file ; } &> /dev/null

このコマンドは file という名前のファイルを作成します file という名前のファイルが存在しない場合 . file という名前のファイルがある場合 、その後何もしません (ただし、ゼロ以外のリターン コードを返します)。

touch に関する長所 コマンド:

  • ファイルが既に存在する場合、タイムスタンプを更新しません
  • 100% bash 組み込み
  • 期待どおりのリターン コード:file の場合は失敗 すでに存在するか、file の場合 作成できませんでした。 file の場合は成功 存在せず、作成されました。

短所:

  • noclobber を設定する必要があります オプション (ただし、リダイレクトに注意するか、後で設定を解除すれば、スクリプトでは問題ありません)。

このソリューションは、実際には open の bash 版であると思います O_CREAT | O_EXCL によるシステムコール .


mv -n を使用した bash 関数を次に示します。 トリック:

function mkatomic() {
  f="$(mktemp)"
  mv -n "$f" "$1"
  if [ -e "$f" ]; then
    rm "$f"
    echo "ERROR: file exists:" "$1" >&2
    return 1
  fi
}

例:

$ mkatomic foo
$ wc -c foo
0 foo
$ mkatomic foo
ERROR: file exists: foo

Linux
  1. bashスクリプトが同時に実行されないようにする

  2. Bashスクリプトをファイルに接続できますか?

  3. シェルスクリプトで一時ファイルを作成するにはどうすればよいですか?

  1. Bash スクリプト:不適切なインタープリター

  2. URLからbashスクリプトを実行

  3. Bash シェル スクリプト内から Vim を開く

  1. ターミナルウィンドウからLinuxでファイルを作成するには?

  2. 新しいファイルを作成しますが、ファイル名が bash に既に存在する場合は番号を追加します

  3. ファイルがシェルスクリプトに存在する場合にのみ移動する