私は長い間bashを使用してきましたが、以前見たことがない(または単に覚えていない)ことを発見しました。出力をログファイルにリダイレクトしようとすると、「該当するファイルまたはディレクトリがありません」エラーが発生します。何千回もやってきましたが、この方法ではないようです。以下は、問題を再現するためのサンプル出力です。
テスト.sh:
#!/bin/bash
logfile="~/logs/$(date +%Y%m%d_%H%M%S).log"
echo "Test" > ${logfile}
出力:
$ ./test.sh
./test.sh: line 3: ~/logs/20220114_025115.log: No such file or directory
結局、問題を〜に分けました。私の問題に対する解決策は、$ HOMEを使用するか、完全なパスをハードコーディングすることでしたが(私はやる!)私の質問は、なぜ〜演算子が私のホームディレクトリに拡張されていないのかということです。私は答えを検索しましたが、私の問題と正確に一致する答えはありません。よろしくお願いします。
答え1
チルダ拡張は、チルダ文字が引用されていない場合にのみ発生します。 Bashのマニュアルから:
単語が引用符のないチルダ文字( '〜')で始まる場合、引用符のない最初のスラッシュまでのすべての文字(または引用符なしのスラッシュがない場合はすべての文字)には、チルダがプレフィックスであると見なされます。
https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html
最初のスラッシュ文字の後ろの位置に引用符を移動して強制的に拡張できます。から"~/logs/$(date +%Y%m%d_%H%M%S).log"
までです~/"logs/$(date +%Y%m%d_%H%M%S).log"
。