猫を交換したいです。
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 を使用します。bash
mapfile
mmap()
zmodload zsh/mapfile
var=$mapfile[filename]
ファイルを開いたりマップしたりできない場合は、何も出力されません。エラーを確認するには、$ERRNO
特殊変数を使用できます。
ERRNO=0
var=$mapfile[filename]
if ((ERRNO)); then
: the mapping failed
fi
$ERRNO
値はモジュールの配列を使用してENOENT
、...コードに変換するEACCESS
か、組み込み関数を使用してエラー文字列に変換できます。$errnos
zsh/system
syserror
zsh/system
mapfile[filename]=$var
ファイルの内容を変更することもできます。これは実際のマッピングです。
whileは$(<filename)
削除されます。みんなfilename
、コンテンツの末尾の改行は、$mapfile[filename]
ファイルの完全なコンテンツ(バイナリファイルを含む)にそのまま拡張されます。