![내가 뭘 하려는 거지?](https://linux55.com/image/220033/%EB%82%B4%EA%B0%80%20%EB%AD%98%20%ED%95%98%EB%A0%A4%EB%8A%94%20%EA%B1%B0%EC%A7%80%3F.png)
저는 다른 맥북에서 직장에서는 bash를, 집에서는 zsh를 사용해 왔습니다. 저는 bash나 zsh 스크립팅에 대해 잘 모르기 때문에 ZSH가 제가 일하는 곳과 동등한 수준이 되어 생산성을 잃지 않을 때까지 전환하는 것이 두렵습니다.
결국 .dot-files
github에 저장소를 만들고 모든 것을 테스트하고 싶었습니다. 효율적인. 그러나 최종 조정을 하기로 결정했을 때 모든 것이 무너졌고 평생 동안 그 이유를 이해할 수 없습니다.
상상하다:
나는 ~/.dot-files를 내 git 저장소의 루트로 사용합니다. 그런 다음 두 개의 하위 폴더 zsh
가 있고 bash
각 파일 안에는 숨겨진 파일과 이를 가져오려는 구성이 있습니다.
$ cd ~/.dot-files/bash/
$ ls -la
drwxr-xr-x 8 me staff 256 May 8 13:28 .
drwxr-xr-x 7 me staff 224 May 8 13:00 ..
-rw-r--r-- 1 me staff 1791 May 8 13:08 .alias
-rw-r--r-- 1 me staff 79837 Apr 12 2022 .git-completion.bash
-rw-r--r-- 1 me staff 1602 May 8 13:49 .git-prompt
-rw-r--r-- 1 me staff 1816 May 8 13:06 .ps1
-rw-r--r-- 1 me staff 877 May 8 13:09 .utils
-rw-r--r-- 1 me staff 142 May 8 15:20 default-config
그리고
$ cd ~/.dot-files/zsh/
$ ls -la
drwxr-xr-x 7 me staff 224 May 8 13:33 .
drwxr-xr-x 7 me staff 224 May 8 13:00 ..
-rw-r--r-- 1 me staff 1423 May 8 12:32 .alias
-rw-r--r-- 1 me staff 18582 May 8 12:32 .git-prompt.sh
-rw-r--r-- 1 me staff 2059 May 8 12:32 .prompt
-rw-r--r-- 1 me staff 926 May 8 14:01 .zsh-git-info
-rw-r--r-- 1 me staff 143 May 8 15:02 default-config
$ 고양이~/.bashrc
source ~/.dot-files/bash/default-config
$ 고양이 ~/.dot-files/bash/default-config
source "$(dirname -- "$0")/.git-prompt"
source "$(dirname -- "$0")/.ps1"
source "$(dirname -- "$0")/.alias"
source "$(dirname -- "$0")/.utils"
이건 작동하지 않아
-bash: ./.git-prompt: No such file or directory
-bash: ./.ps1: No such file or directory
-bash: ./.alias: No such file or directory
-bash: ./.utils: No such file or directory
$ 고양이~/.zshrc
source ~/.dot-files/zsh/default-config
$ 고양이 ~/.dot-files/zsh/default-config
source "$(dirname "$0")/.alias"
source "$(dirname "$0")/.prompt"
source "$(dirname "$0")/.zsh-git-info"
source "$(dirname "$0")/.git-prompt.sh"
이것은 실제로 완벽하게 작동합니다.
내가 뭘 하려는 거지?
쉘을 변경하고 터미널을 다시 시작하고 싶습니다 chsh -s /bin/bash
. 나는 그것이 작동하기를 바랍니다.
~/.bashrc
누구나 어디에서나 복제할 수 있는 저장소를 가리키고 싶습니다 .
저장소가 기본 구성이 있는 상대 경로를 참조하기를 원합니다. 전체 경로를 하드코딩하고 싶지 않습니다.
zsh의 경우 source "$(dirname "$0")
괜찮습니다. 내가 이해하는 한, 단계는 다음과 같습니다.
~/.zshrc
파일 소스를 직접 호출합니다.~/.dot-files/zsh/default-config
- 해당 파일은 소스 명령을 호출하지만 "my path"
$(dirname "$0")
와 "my"와 동일한 폴더에 파일 이름이 차례로 삽입됩니다.source "$(dirname "$0")/.alias"
안으로source ~/.dot-files/zsh/.alias
Bash가 작동하지 않는데 이유가 확실하지 않습니다.
답변1
Bourne/POSIX 쉘에서,특수 매개변수$0
셸에서 실행되는 스크립트의 이름(또는 셸 자체의 이름)으로 설정합니다. 다음을 사용하여 다른 스크립트 파일을 읽을 때 변경되지 않습니다..
("가리키다")주문하다.불다source
동의어를 사용할 때를 포함하여 이 영역의 표준 동작을 따르십시오..
("가리키다").
zsh에서는 기본적으로특수 매개변수$0
현재 스크립트의 경로 또는 현재 함수의 이름으로 설정합니다. 즉, 함수를 사용 .
하거나 빌드할 때, 함수가 호출될 때, 함수나 스크립트에서 반환될 때 source
변경됩니다 . 옵션을 설정 해제하여 zsh를 표준 동작으로 변경할 수 있습니다function_argzero
(zsh가 sh 또는 ksh 에뮬레이션 모드가 아닌 한 기본값) 또는 설정posix_argzero
.
Bash에서는 현재 스크립트의 경로( .
또는 의 영향을 받음 source
)를 이름 아래에서 사용할 수 있습니다.$BASH_ARGV0
.
그런데 디렉터리 구성 요소가 있는 디렉터리가 아닌 파일에 대한 경로가 있다는 것을 알고 있으므로 "${0%/*}"
파일이 포함된 디렉터리를 참조하는 간단하고 약간 빠른 방법을 사용할 수 있습니다. 1
1"$(dirname -- "$0")"
디렉토리 이름이 개행 문자로 끝나고 "$(dirname "$0")"
경로가 대시로 시작되는 경우보다 더 효율적 이지만 여기서는 적용되지 않습니다. 경로가 슬래시로 끝나거나 슬래시가 전혀 포함되어 있지 않으면 작동하지 않는다는 점에서 더 취약하지만 여기에도 적용되지 않습니다.
답변2
문제를 해결하는 두 가지 간단한 방법이 있습니다.
사용pushd/popd
default-config
파일의 현재 폴더를 변경 하고 나중에 복원하십시오.
if pushd ~/.dot-files/bash/ > /dev/null; then
source ./.alias
source ./.prompt
source ./.zsh-git-info
source ./.git-prompt.sh
popd > /dev/null
fi
(zsh에서는 -q
stdout을 /dev/null로 리디렉션하여 디렉토리 스택 덤프를 피할 수 있지만 bash에서는 그렇지 않습니다.)
물론 default-config
이 줄에서는 파일이 달라집니다.
변수 사용
.bashrc
및 내에서 변수를 정의합니다 .zshrc
. 이 변수는 소스 파일의 위치를 가리킵니다.
# .bashrc
fdir=~/.dot-files/bash
source "${fdir}/default-config"
같은 일을.zshrc
두 쉘의 내부는 default-config
동일할 수 있습니다. 다음 변수를 재사용하면 됩니다.
source "${fdir}/.alias"
source "${fdir}/.prompt"
source "${fdir}/.zsh-git-info"
source "${fdir}/.git-prompt.sh"