ターミナルが設定を尊重しないのはなぜですか?
Dec 10 2020
先週のある時点で、私のターミナルは「新しいタブを開く:同じ作業ディレクトリ」設定を尊重しなくなりました。「新しいウィンドウ...」でテストしても同じ結果が得られました。
私のシェルはzshです。
ここでDanRosenstarkからの回答に従うことで、これを機能させることができました。 https://apple.stackexchange.com/a/340778/398648
# http://superuser.com/a/315029/4952
# Set Apple Terminal.app to resume directory... still necessary 2018-10-26
if [[ $TERM_PROGRAM == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]] {
function chpwd {
local SEARCH=' '
local REPLACE='%20'
local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
printf '\e]7;%s\a' "$PWD_URL"
}
chpwd
}
しかし:どうすればこれを自分で判断できたのか、または同様の問題をどのようにデバッグできたのかわかりません。
ターミナルのこれらの最初のステップが何であるかを理解するためのヒントやコツをいただければ幸いです。
うまくいかなかったこと:
- 新しいタブまたは新しいウィンドウの設定を切り替える
- 、ファイルの
return
最初の行で名前を変更または追加する.zshrc
.zsh*
- 現在の作業ディレクトリの[新しいターミナルを開く]タブのすべての提案が機能しない
その他の潜在的に有用な情報:
- 「同じプロファイル」/「デフォルトプロファイル」の設定は、変更されたときに尊重されます
pwd
の最初の行として追加すると、.zshrc
ディレクトリはすでに存在します/home/<myuser>
nix
最近(を含むnix-darwin
)に関連するいくつかのツールとプロジェクトをインストールおよびアンインストールしました

メタデータ:
OS macOS Catalina 10.15.7 (19H2)
Terminal 2.10 (433)
zsh 5.7.1 (x86_64-apple-darwin19.0)
回答
3 MarlonRichert Dec 28 2020 at 03:43
そのスクリーンショットの「エスケープシーケンス…」をクリックすると、次のように表示されます。

ただし、これからはわかりませんが、これは通常/etc/zshrc_Apple_Terminal
、から呼び出されるファイルで処理され/etc/zshrc
ます。/etc/zshrc_Apple_Terminal
呼び出されないようにしたり、実行しようとしていることをオーバーライドしたりできることがいくつかあります。
- Zshを
zsh -d
またはで開始していzsh -f
ます。 - あなたはファイルを持っている
${ZDOTDIR:-$HOME}/.zshenv
か${ZDOTDIR:-$HOME}/.zprofile
、あなたが持っているsetopt NO_rcs
またはsetopt NO_globalrcs
- パラメータに値
$TERM_PROGRAM
がありませんApple_Terminal
。 - Zshにはへの読み取りアクセス権がありません
/etc/zshrc_Apple_Terminal
。 /etc/zshrc_Apple_Terminal
ソースを取得するとき、パラメーター$INSIDE_EMACS
はゼロ以外です。- ソースを取得した後の
precmd
ある時点で関数を定義します。これにより、で定義された関数がオーバーライドされます。/etc/zshrc_Apple_Terminal
add-zsh-hook
デバッグするためにできること:
- 非グローバル構成ファイルなしでサブシェルを開始し、そこでもバグが発生するかどうかを確認します。
このサブシェルで問題が発生しない場合は、問題が非グローバルドットファイルのどこかにあることを意味します。これらのファイルのリストを取得するには、cd $(mktemp -d); HOME=$PWD ZDOTDIR=$PWD zsh
ls ${ZDOTDIR:-$HOME}/.z(log(in|out)|profile|sh(env|rc))(-^/)
- でZshを再起動
exec zsh -vx
し、最初から出力を調べて、/etc/zshrc_Apple_Terminal
ソースが取得されるかどうか、および後でprecmd
設定されたフックをオーバーライドするものがあるかどうかを確認します。