저는 다음과 같은 도트 파일 관리 소프트웨어를 사용하고 있습니다.조금.env
. 다음 내용으로 이름이 지정된 구성 파일을 사용하십시오 git_folder="~/code/Git"
.
아래와 같이 처음으로 사용하기 전에 스크립트를 사용하여 이 도트파일 도구를 설정할 수도 있습니다.
#!/bin/bash
env1="~/Dropbox/.env"
env2="/mnt/d/Dropbox/.env"
if [ -f $env1 ]; then
echo "Found dotdrop env file, installing dotfiles..."
source $env1
eval $(grep -v "^#" $env1) dotdrop --cfg=${git_folder}/dotfiles/config.yaml install
elif [ -f $env2 ]; then
echo "Found dotdrop env file, installing dotfiles..."
source $env2
eval $(grep -v "^#" $env2) dotdrop --cfg=${git_folder}/dotfiles/config.yaml install
else echo "Pls sync environment files first!"
fi
구성 파일을 에 저장하면 ~/Dropbox/.env
스크립트를 실행할 때 얻을 수 있습니다 "Pls sync environment files first!"
(조건부가 필요한 경우 실행). 구성 파일이 에 저장되어 있으면 /mnt/d/Dropbox/.env
스크립트에서 예상되는 elif 조건이 발생합니다.
디버그 모드에서 스크립트를 실행하고 차이점을 얻을 때까지 이유를 찾았습니다.
➜ scripts git:(master) ✗ bash -x dotdrop_setup.sh
+ env1='~/Dropbox/.env'
+ env2=/mnt/d/Dropbox/.env
+ '[' -f '~/Dropbox/.env' ']'
+ '[' -f /mnt/d/Dropbox/.env ']'
+ echo 'Pls sync environment files first!'
Pls sync environment files first!
~
그래서 와 의 차이가 /home/user
그 이유라고 생각합니다.
(roach가 사용자 이름입니다) ~
로 변경했을 때 작동했습니다./home/roach
➜ scripts git:(master) ✗ bash -x dotdrop_setup.sh
+ env1=/home/roach/Dropbox/.env
+ env2=/mnt/d/Dropbox/.env
+ '[' -f /home/roach/Dropbox/.env ']'
+ echo 'Found dotdrop env file, installing dotfiles...'
Found dotdrop env file, installing dotfiles...
+ source /home/roach/Dropbox/.env
++ git_folder='~/code/Git'
++ grep -v '^#' /home/roach/Dropbox/.env
+ eval git_folder='~/code/Git'
++ dotdrop '--cfg=~/code/Git/dotfiles/config.yaml' install
_ _ _
__| | ___ | |_ __| |_ __ ___ _ __
/ _` |/ _ \| __/ _` | '__/ _ \| '_ |
\__,_|\___/ \__\__,_|_| \___/| .__/ v0.22.0
|_|
0 dotfile(s) installed.
디버깅 결과 ''
서라운드 사운드가 + env1='~/Dropbox/.env'
제거된 것으로 나타났는데 그 이유인 것 같습니다.
하지만,왜?
추가 질문,
alias dotdrop="eval $(grep -v "^#" $env1) /usr/bin/dotdrop --cfg=${git_folder}/dotfiles/config.yaml install"
등에 추가된 구성입니다 bashrc
. zshrc
스크립트에 직접 추가하면 작동하지 않습니다!
마침내 내가 추가해야 한다는 것을 알았습니다 source $env
.
그래서왜bashrc 파일에서 작동합니까?
답변1
~
홈 디렉토리에 대한 바로가기이지만 문자열 시작 부분에 나타나는 경우에만 해당됩니다.외부 인용. 할당 연산자의 오른쪽 시작은 문자열의 시작이므로 env1=~/Dropbox/.env
작동합니다(또는 env1=~"/Dropbox/.env"
다양한 변형). env1
로 설정되지만 현재 디렉터리에서 단일 문자 이름을 가진 디렉터리를 찾기 위해 파일 이름으로 사용되는 정확한 문자열로 설정됩니다 /home/roach/Dropbox/.env
.env1="~/Dropbox/.env"
env1
~/Dropbox/.env
~
물결표는 와일드카드가 아닌 약어입니다. $env1
외부 따옴표는 값의 와일드카드 문자를 확장 env1
하지만 물결표는 확장하지 않습니다. 물결표는 와일드카드 문자가 아니기 때문입니다.
를 사용할 수도 있습니다 env1="$HOME/Dropbox/.env"
. 이는 와 동일합니다 env1=~/Dropbox/.env
. 큰따옴표 안의 문자(달러) $
는 특별한 의미를 갖습니다(따옴표 외부와 동일). 이는 변수 대체(또는 명령 또는 산술 대체)를 시작합니다. ~
반면에 문자(물결표)가 따옴표(또는 큰따옴표) 안에 있으면 이는 단지 일반 문자입니다.
별칭의 경우 bash 스크립트에서 작동하지 않는 이유는 bash가 기본적으로 스크립트에서 별칭을 확장하지 않기 때문입니다. 별칭은 각 셸 인스턴스의 속성이므로 스크립트에 별칭 정의를 포함하거나 가져오지 않는 한 어떤 스크립트에도 효과가 없습니다. 이는 프로세스 환경의 일부가 아닙니다.
별칭이 두 번째 스크립트에서 작동하는 이유는 dotdrop 자체가 구성 값을 읽을 때 물결표를 확장하기 때문입니다.