내가 뭘 하려는 거지?

내가 뭘 하려는 거지?

저는 다른 맥북에서 직장에서는 bash를, 집에서는 zsh를 사용해 왔습니다. 저는 bash나 zsh 스크립팅에 대해 잘 모르기 때문에 ZSH가 제가 일하는 곳과 동등한 수준이 되어 생산성을 잃지 않을 때까지 전환하는 것이 두렵습니다.

결국 .dot-filesgithub에 저장소를 만들고 모든 것을 테스트하고 싶었습니다. 효율적인. 그러나 최종 조정을 하기로 결정했을 때 모든 것이 무너졌고 평생 동안 그 이유를 이해할 수 없습니다.

상상하다:

나는 ~/.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에서는 -qstdout을 /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"

관련 정보