bashが$(<"filename")を自動的に置き換える方法

bashが$(<"filename")を自動的に置き換える方法

猫を交換したいです。

var=$(cat "filename" 2>/dev/null)

bashism構文を介して:

var=$(<"filename")

問題は、そのような警告を避けるために攻撃を沈黙させる方法がわからないことです。

bash: filename: No such file or directory

私はこれを試しました:

var=$(2>/dev/null <"filename")

ただし、既存のファイルは読み込まれませんvar

答え1

割り当てを複合ブロックにラップし、リダイレクトを使用するのがうまくいくようです。

{ var=$(<"$file"); } 2>/dev/null;

例えば

$ echo hello > test1; rm -f test2
$ file=test1; { var=$(<"$file"); } 2>/dev/null; echo "${var:-[it is empty]}"
hello
$ file=test2; { var=$(<"$file"); } 2>/dev/null; echo "${var:-"[it is empty]"}"
[it is empty]

サブシェルの作成には使用しないでください( .. )。割り当てられた変数が失われるためです。

答え2

まず、使用可能で読み取り可能であることをテストします。

if [ -f "filename" ] && [ -r "filename" ]; then
    var=$(<"filename")
fi

この-fテストは、次を参照するかどうかfilenameをテストします。一般ファイルそして、-r読めるかどうかをテストしてみてください。

答え3

もう1つの方法は、まずファイルが存在することを確認し、それを変数として読み取ることです。

[ -e filename ] && var=$(<filename)

答え4

参考までに:

ではzsh、キーと呼ばれるファイルの内容にマップされる特別な連想配列を使用できます(組み込み$mapfile関数とは何の関係もありません(ファイルをマップしない)。 )。通常のファイルにのみ so を使用します。bashmapfilemmap()

zmodload zsh/mapfile
var=$mapfile[filename]

ファイルを開いたりマップしたりできない場合は、何も出力されません。エラーを確認するには、$ERRNO特殊変数を使用できます。

ERRNO=0
var=$mapfile[filename]
if ((ERRNO)); then
  : the mapping failed
fi

$ERRNO値はモジュールの配列を使用してENOENT、...コードに変換するEACCESSか、組み込み関数を使用してエラー文字列に変換できます。$errnoszsh/systemsyserrorzsh/system

mapfile[filename]=$varファイルの内容を変更することもできます。これは実際のマッピングです。

whileは$(<filename)削除されます。みんなfilename、コンテンツの末尾の改行は、$mapfile[filename]ファイルの完全なコンテンツ(バイナリファイルを含む)にそのまま拡張されます。

関連情報