すべての子プロセスは Bash(!) です。

すべての子プロセスは Bash(!) です。

私はGDBを使用しようとしていて、デバッグ中のプログラムを作成しようとするたびにBashが生成されることを発見しました(GDBはと言ってBashが表示されます。Bashをstarting myProg...終了するとGDBに戻るか、Bashの終了状態)。最初に私はこれがGDBの奇妙な問題だと思いましたが、Vimでプロセスを作成しようとするとBashも生成されることがわかりました。

瞬間的にインスピレーションを受け、問題を私のデフォルトシェルがTcshであるという事実と関連付けまし.tcshrcexec bash。 Tcshに変更するか、bashTcshを使用すると問題がなくなりました。

私はTcshがどのように私の問題を引き起こすのか分かりません。誰でも情報を提供できますか?


ところで、ただ.NETのPATH="" /usr/bin/gdb代わりにGDBを実行することでそうすることができましたgdbbash: command not found

答え1

他の答えには良い説明があります。

解決策として、私はexport SHELL=bashコマンドを生成するために使用するシェルを決定するためにこの変数を使用するようにgdbやscreenなどの多くのコマンドを設定しました。

したがって、 bash だけを起動するように設定された tcsh の代わりに bash を直接使用してコマンドを生成します。


SSHキーを使用してサーバーにログインし、Authorized_keysファイルのキーに強制コマンドを追加すると、設定を改善できます。

これにより、tcshスクリプトを破損することなくbashから直接起動できます。

答え2

.tcshrc ファイルでexec bash次のようにラップできます。

if ($?prompt) then
    exec /path/to/bash
endif

$?prompt非対話型シェルではfalseなので、対話型セッションがある場合にのみbashを使用してください。

答え3

私は明らかな理由がgdbプロセスを作成するためにシェルを使用していると思います。

Vimがやります(help !

:!{cmd}         Execute {cmd} with the shell.

:!ls -lしたがって、Vimが実際に実行されると言うと、

$ SHELL -c 'ls -l'

私の考えでは(私はあなたの言葉を理解するという点で)ハッカースタイル正しく設定してください)のexec bash -l代わりに簡単に修正できますexec bash

その理由は、(ログインシェルではない)後でログインシェル()で使用し、それを指す環境変数をexec bash変更しないためです。選択したシェルを直接使用する必要があります()。SHELLgdbvimtcshbash

メモ:あなたはそれについて考えることができます。何かを実行しているときtcsh...期待どおりに実行されない可能性があります。

答え4

私が疑うのは、GDB内でプログラムを実行すると、プログラムを実行するためにサブシェルを起動してrcファイルを取得することです。

exec のマニュアルページには、「exec() 関数系列は現在のプロセスイメージを新しいプロセスイメージに置き換えます」と示しています。

私の考えで何が起こっているのかは、rcファイルでexecを呼び出すと、bashで実行しようとしていたすべてのものを置き換え、終了したときにbash終了コードを使用してGDBに戻ることです。 bashでexecを使用してプログラムを実行するには、tcsh(Bashのargvと同じ)が実行したいすべてのエントリに対するプログラム呼び出しを保存する場所を特定し、それをbashに渡す必要があります。

rcファイルが好きで、argvをチェックしてプログラムを実行しようとしていることを確認したり、ログインシェルをインポートしてそれに基づいて他の動作を実行したりすることもできます。

関連情報