zsh는 변수에 저장된 경로를 사용하여 파일에 씁니다.

zsh는 변수에 저장된 경로를 사용하여 파일에 씁니다.

파일 이름이 변수에 저장된 파일에 텍스트를 추가하려고 합니다.

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

그러나 그것은 작동하지 않습니다. 내가 아는 한, 아무 일도 일어나지 않으며 해당 줄이 파일에 기록되지 않습니다. 지금 테스트할 때 스크립트의 다른 줄에 있는 텍스트를 변수를 통하지 않고 파일에 직접 에코합니다. 이 모든 것이 작동합니다. 내 파일에 테스트 중인 변수에 대한 한 줄이 누락되었습니다. 명확성을 위해 아래에 실제 코드를 포함했습니다.

에코하면 $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

}

관련 정보