Linuxのscreenコマンドについて学んだ-それは天才です。大好きです。ただし、実際の端末/画面のプロンプトは、標準のbashプロンプトとは外観や動作が異なります。つまり、色が同じでない、タブ補完が機能していない、などです。
Screenに通常のように動作するように指示する方法はありますか(少なくとも、私が慣れているように通常)bashプロンプトはありますか?
Mac(ターミナル)からヘッドレスLinuxボックス(Ubuntu)にsshで接続しています。ログイン後、TERM=xterm-color
とscreenを実行するとTERM=screen
。
以下の提案を試して、$TERM
値が最初です。
この投稿 のおかげで、~/.screenrc
に1行追加しました。
# ~/.screenrc
defshell -bash # dash makes it a login Shell
次に、~/.bashrc
、/etc/bashrc
などのものが実行されます。
画面は用語タイプをscreen
に変更します。次の2つのいずれかを実行できます。
.screenrc
の期間設定を変更する.bashrc
ファイルを変更して、TERM=screen
とTERM=xterm
を探します。私はあなたがあなたの質問を書く方法が好きです、私は私自身に同じことを尋ねていました、そしてそれを理解するのに少し時間がかかりました。シェルの呼び出しについてすでに少し知っていて幸運だったので、問題はどこかにあると考えました。
これが私の発見です。まず、個人的には、ログインシェルと非ログインシェルの違いを知っておく価値があり、知っておく価値があります。 man $Shell
を実行し、INVOCATIONのセクションを検索して、詳細を読んでください。
プロンプトでshopt login_Shell
を発行することにより、現在のシェルインスタンスがログインシェルか非ログインシェルかを確認できます。これは通常、読み取り専用オプションです。
私のDebianシステムでは、screen
は常にデフォルトで非ログインシェルになっています。
Webを検索してman $Shell
を読んだ後、いくつかのことをテストしましたが、次の2つの方法がうまくいきました。 ~/.screenrc
で、次のように行を追加/更新します。
Shell -$Shell
それがうまくいかず、bash
を使用している場合は、代わりに Seamus で共有されているように試すことができます。
defshell -bash
前述のとおり、プロンプトでshopt login_Shell
を発行することにより、現在のシェルインスタンスがログインシェルであるかどうかをテストできます。
Bashの実行方法に応じて、ログインシェルを実行している場合があります。 screen
を実行すると、非ログインインタラクティブシェルが実行されます。
違いは、どの起動スクリプトが実行されるかです。
/etc/bash.bashrc
、次に~/.bashrc
は、非ログインインタラクティブシェルの起動時に提供されます
/etc/profile
その後、最初に見つかった~/.bash_profile
、~/.bash_login
、~/.profile
は、インタラクティブログインシェルの起動時に提供されます。
これが影響している可能性があります。
また、$TERM
異なります。
screenはbashを置き換えず、bashや他のシェルを実行します。 csh
、zsh
、またはbash
を実行している可能性がありますが、パラメーターが異なります。
最初に試すのは、ps
と/proc/<pid>/cmdline
をチェックして、login
と同じパラメーターで同じシェルを使用していることを確認することです。
その後、/etc/screenrc
およびman screen
FILESセクションで言及されているその他のファイルを確認します。
同じ問題がありましたが、画面を実行したときに、巧妙に見つけたクールな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\]\$ "
同様に、変数はネストされた実行で失われません。
"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を間違って設定すると他のものが壊れると思いますが、スクリプトは私が気付いたものです。
シェルの初期化を開始する前に、_.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ログインをキャンセルし、ユーザーのセッションで画面を手動で起動しますそこに須藤。
ここでの重要なポイントは、「シェルの初期化前」であるため、実行中のスクリーンセッションがすでにある場合は、ロケールやその他の要素ですでに初期化されており、再度やり直す必要はありません。