나는 오랫동안 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"
.