~가 있는 것과 없는 Bash의 문자열 변수의 차이점은 무엇입니까? [복사]

~가 있는 것과 없는 Bash의 문자열 변수의 차이점은 무엇입니까? [복사]

저는 다음과 같은 도트 파일 관리 소프트웨어를 사용하고 있습니다.조금.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 자체가 구성 값을 읽을 때 물결표를 확장하기 때문입니다.

관련 정보