シェルのプロンプトでコマンドの実行を停止する方法は?

シェルのプロンプトでコマンドの実行を停止する方法は?

私のプロンプトには、現在のディレクトリの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 3bash を再実行してみてください。

同じ状況:

$ 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]そして-tbashrcをバイパスします(試してみたことはありません)
  • ssh [email protected] bash --noprofile --norcもっと安全そうですね(やってみませんでした)

関連情報