私は別のMacBookで仕事でbashを、家ではzshを使ってきました。私はbashやzshスクリプトについてよくわからないので、ZSHが私が働いている場所と同等のレベルになり、生産性が失われないまで切り替えることを恐れています。
結局、.dot-files
githubにリポジトリを作成し、すべてをテストしたかったのです。効率的。しかし、最終的な調整をすることを決めたとき、すべてが崩壊し、生涯の間にその理由を理解することはできません。
想像する:
私は〜/.dot-filesを私のgitリポジトリのルートとして使用します。その後、2つのサブフォルダ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
問題を解決する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"