zsh は変数に格納されたパスを使用してファイルに書き込みます。

zsh は変数に格納されたパスを使用してファイルに書き込みます。

ファイル名が変数に格納されているファイルにテキストを追加しようとしています。

x="/path/to/file.txt"
echo "some text here" >> "${=x}"

しかし、それは動作しません。私が知っている限り、何も起こらず、その行はファイルに書き込まれません。今テストするとき、スクリプトの別の行にあるテキストを変数を介さずにファイルに直接エコーします。これはすべてうまくいきます。私のファイルにテスト中の変数の1行がありません。明確にするために、以下に実際のコードを含めました。

エコーすると、$ x が正しく拡張され、「${=x}」をファイル名に手動で置き換えることができます。私は何が間違っていましたか?

ありがとうございます!

詳細:zsh 5.8
MacOS Big Sur

実際のコード(会社名が難読化):

# Define log file location.
# Log file can be updated later for portability. But for now, I want to keep it in a personal directory.
#
readonly LOG_FILE="/Users/jim.turner.m1/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log"

# Prep log file
#
prep_log()
{
#       echo "==============================================================" >> "${=LOG_FILE}"
        echo "Sanitize.sh started $(date)." >> ~/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log
        echo "Sanitizing $(pwd)." >> ~/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log
        echo "==============================================================" >> ~/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log
        echo >> ~/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log
}

結果:

Sanitize.sh started Fri May 21 09:21:27 EDT 2021. 
Sanitizing /Users/jim.turner.m1/Desktop/untitled folder.
==============================================================
 

答え1

問題は、変数をエスケープされたスペースを含む文字列に設定することです。あなたがやっていることは、var='foo\ bar'文字列が保存されたことを意味します。そしてこれ\。ただし、参照された変数(良い)を使用しましたが、これは名前付きファイルのfoo\ bar代わりに名前付きファイルを探していることを意味しますfoo bar。変数を設定するとき、誰でも引用符付き文字列またはエスケープスペース(両方ではない):

readonly log_file=/Users/jim.turner.m1/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log

または

readonly log_file="/Users/jim.turner.m1/OneDrive - obfuscated/Shell Scripts/sanitize.log"

これらのいずれかが機能するはずです。また、シェル変数に大文字を使用することは環境変数の慣例であり、時には変数名の競合を引き起こす可能性があるため、小文字を使用するように変数を変更した方法に注意してください。最後に、非常に小さな点は、必要なく変数を$(pwd)使用できることです。PWDトレドック物をきれいで清潔に保ちます。これらすべてを他の改善と組み合わせると、次のような結果が得られます。

# Define log file location.
# Log file can be updated later for portability. But for now, I want to keep it in a personal directory.
#
readonly log_file="/Users/jim.turner.m1/OneDrive - obfuscated/Shell Scripts/sanitize.log"

# Prep log file
#
prep_log()
{
  cat << EoF > "$log_file"
==============================================================
Sanitize.sh started $(date).
Sanitizing $PWD
==============================================================

EoF

}

関連情報