私のプロンプトには、現在のディレクトリのgit repoに関するいくつかの情報が含まれています。私が何かをするときcd
、私のシェルは任意のコマンド(例えばgit status
)を実行します。
同じ端末を介してこれらのコマンドの実行を停止する方法はありますか?キーボードからのシグナルの送信(例:Ctrl+経由c)は機能しません。
アップデート#1
私はこのコマンドを永久に無効にしたくありません。ただコマンドが実行を開始し、実行中に停止したいだけです。
答え1
これらのコマンドは、特定の形式のシェルの子プロセスです。pstree -p $$
現在シェルで実行されているプロセスを一覧表示する場合。その後、Ctrl-C(SIGINT)と同じシャットダウンコマンドを実行できます。これは手動バックグラウンドコマンドの例ですが、プロンプトの更新にも同じでなければなりません。説明すると、$$
pstreeはシェルプロセスIDを置き換え、pstreeは親/子関係のすべてのプロセスを表示し、-pオプションはそれを現在のシェルに制限します。もちろん、シェルpidを殺すのではなく、殺したい子供だけを殺してください。
$ find / 2> /dev/null > /dev/null &
[1] 916595
$ pstree -p $$
bash(915332)─┬─find(916595)
└─pstree(916598)
$ kill 916595
[1]+ Terminated find / 2> /dev/null > /dev/null
$
`
答え2
これにより:
PS1='$(set -x; sleep 3; echo STATUS)$ '
これがうまくいくことがわかります^C
。プロンプトを再度sleep 3
bash を再実行してみてください。
同じ状況:
$ PROMPT_COMMAND='git_status=$(set -x; sleep 3; echo STATUS)' PS1='$git_status$ '
この問題は次の方法で解決できます。
PROMPT_COMMAND='
interrupted=0
trap interrupted=1 INT QUIT
git_status=$(set -x; sleep 3; echo STATUS)
trap - INT QUIT
if (( interrupted )); then
git_status+="<INTERRUPTED>"
fi'
PS1='$git_status$ '
SIGINTにハンドラを追加します。信号が処理され、$PROMPT_COMMAND
正常に完了すると、bashはプロンプトを再描画しません。コマンドが中断されたというメッセージに情報を追加することもできます。
set -x; sleep 3; echo STATUS
この例では、プレースホルダとして使用されているものをプレースホルダまたはそれに対応するものに置き換えることができますgit status
。
zsh では、次のコマンドを使用して、同様できちんとした操作を実行できます。
precmd() {
set -o localoptions -o localtraps
local interrupted=0
trap interrupted=1 INT QUIT
psvar[1]=$(set -x; sleep 3; echo STATUS)
if (( interrupted )) psvar[1]+='<INTERRUPTED>'
}
PS1='%1v$ '
答え3
bashを使用していますか(表示するにはエコ$ 0)?cd
他のエントリ(tryunalias cd
または)のエイリアスがないと、unset cd
シェルの起動時に何かがこの動作を引き起こすと疑われます。 Bashでは、.profile、.bashrc、またはシステムbashrcにあります。存在する根--noprofile --norc
、ボックスにSSHで接続したり、既存の端末から新しい端末を呼び出すときに使用することをお勧めします。だから、
- Bashを呼び出すことから始めましょう。
sh
.bashrcは必要ありません。 「エラー」ターミナルセッションでこれを行うことができます。 ssh -t [email protected]
そして-t
bashrcをバイパスします(試してみたことはありません)ssh [email protected] bash --noprofile --norc
もっと安全そうですね(やってみませんでした)