web-dev-qa-db-ja.com

標準のbashシェルのように動作するようにscreenに要求するにはどうすればよいですか?

Linuxのscreenコマンドについて学んだ-それは天才です。大好きです。ただし、実際の端末/画面のプロンプトは、標準のbashプロンプトとは外観や動作が異なります。つまり、色が同じでない、タブ補完が機能していない、などです。

Screenに通常のように動作するように指示する方法はありますか(少なくとも、私が慣れているように通常)bashプロンプトはありますか?

追加情報

Mac(ターミナル)からヘッドレスLinuxボックス(Ubuntu)にsshで接続しています。ログイン後、TERM=xterm-colorとscreenを実行するとTERM=screen

以下の提案を試して、$TERM値が最初です。

39
thornomad

この投稿 のおかげで、~/.screenrcに1行追加しました。

# ~/.screenrc
defshell -bash      # dash makes it a login Shell

次に、~/.bashrc/etc/bashrcなどのものが実行されます。

40
Seamus Abshere

画面は用語タイプをscreenに変更します。次の2つのいずれかを実行できます。

  1. .screenrcの期間設定を変更する
  2. .bashrcファイルを変更して、TERM=screenTERM=xtermを探します。
13
staticsan

私はあなたがあなたの質問を書く方法が好きです、私は私自身に同じことを尋ねていました、そしてそれを理解するのに少し時間がかかりました。シェルの呼び出しについてすでに少し知っていて幸運だったので、問題はどこかにあると考えました。

これが私の発見です。まず、個人的には、ログインシェルと非ログインシェルの違いを知っておく価値があり、知っておく価値があります。 man $Shellを実行し、INVOCATIONのセクションを検索して、詳細を読んでください。

プロンプトでshopt login_Shellを発行することにより、現在のシェルインスタンスがログインシェルか非ログインシェルかを確認できます。これは通常、読み取り専用オプションです。

私のDebianシステムでは、screenは常にデフォルトで非ログインシェルになっています。

Webを検索してman $Shellを読んだ後、いくつかのことをテストしましたが、次の2つの方法がうまくいきました。 ~/.screenrcで、次のように行を追加/更新します。

Shell -$Shell

それがうまくいかず、bashを使用している場合は、代わりに Seamus で共有されているように試すことができます。

defshell -bash

前述のとおり、プロンプトでshopt login_Shellを発行することにより、現在のシェルインスタンスがログインシェルであるかどうかをテストできます。

11
Kyle

Bashの実行方法に応じて、ログインシェルを実行している場合があります。 screenを実行すると、非ログインインタラクティブシェルが実行されます。

違いは、どの起動スクリプトが実行されるかです。

  • /etc/bash.bashrc、次に~/.bashrcは、非ログインインタラクティブシェルの起動時に提供されます

  • /etc/profileその後、最初に見つかった~/.bash_profile~/.bash_login~/.profileは、インタラクティブログインシェルの起動時に提供されます。

これが影響している可能性があります。

また、$TERM 異なります。

screenはbashを置き換えず、bashや他のシェルを実行します。 cshzsh、またはbashを実行している可能性がありますが、パラメーターが異なります。

最初に試すのは、ps/proc/<pid>/cmdlineをチェックして、loginと同じパラメーターで同じシェルを使用していることを確認することです。

その後、/etc/screenrcおよびman screen FILESセクションで言及されているその他のファイルを確認します。

2
Javier

同じ問題がありましたが、画面を実行したときに、巧妙に見つけたクールなPS1カラープロンプトを失いました:P。

問題は、私がそれを〜/ .bash_profileでこのように実行していたことです

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

つまり、screenがbash_profileを実行していたとき、PS1は引き継がれていません。

修正は簡単です:〜。/ bash_profileのPS1ステートメントにエクスポートを追加して、次のようにします。

export PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

同様に、変数はネストされた実行で失われません。

2
davidsaliba

"defshell -bash"について何か追加したいだけです(何ヶ月も頭をひっかいた後、私はそれを理解しました)。これを行うと、screenによって実行される子シェルの$ Shellは、通常のように "/ bin/bash"ではなく "bash"に設定されます。その後、スクリーンセッション内で「スクリプト」を実行すると、次のようになります。

$ script
Script started, file is TypeScript
script: failed to execute bash: No such file or directory

または、少なくともそれが私のUbuntu 14.04ボックスで起こっていることです。私が使用してきた回避策は、$ Shell=/bin/bash scriptを実行することです。 $ Shellを間違って設定すると他のものが壊れると思いますが、スクリプトは私が気付いたものです。

1
Roy Smith

シェルの初期化を開始する前に、_.profile_でこのスニペットを使用しています:which screen > /dev/null 2>&1 && { screen -q -ls if [ $? -gt 10 ]; then read -p "$(tput setaf 2)Found a running SCREEN sesion, attach?$(tput sgr0)[Y/n] " y >&2 if [ "${y:-y}" = "y" -o "$y" = "Y" ]; then screen -aDR && logout fi else echo "$(tput setaf 3)No running SCREEN sessions found.$(tput sgr0)" >&2 fi }

次に、実行中のスクリーンセッションがない場合、私は…まあ、私は標準のシェルプロンプトに分類されません。 Sudoパスワードのプロンプトがもう1つあります(サーバーを管理するためにログインする時間の99%から)。長時間のタスクを実行する場合は、Sudoログインをキャンセルし、ユーザーのセッションで画面を手動で起動しますそこに須藤。

ここでの重要なポイントは、「シェルの初期化前」であるため、実行中のスクリーンセッションがすでにある場合は、ロケールやその他の要素ですでに初期化されており、再度やり直す必要はありません。

0
AnrDaemon