標準のbashシェルのように振る舞うように画面を要求するにはどうすればよいですか?


37

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

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

追加情報

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

以下の提案を試して、$TERM最初に値を変更できるかどうかを確認します。


好奇心から、どのOS、および画面を起動するときにどのタイプの端末を持っていますか?あなたの問題は、あなたのターミナルが何か間違ったことをしたり、スクリーンに対して間違って識別することに関係があると思います。
ゾレダチェ

@Zoredache-上記の投稿にその情報を追加しました。ありがとう。バックスペースキーが機能するように、ターミナルの設定を調整する必要がありました...
thornomad

うん、Terminal.appは本当に好きじゃない。個人的に私はあなたが代替見る(使用を検討してお勧めserverfault.com/questions/19240/...
Zoredache

回答:


39

この投稿のおかげで、私がしたことは次の行を追加することでした~/.screenrc

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

次に、あなたの中のもの~/.bashrc/etc/bashrcなどが実行されるはずです。


13

screenはterm-typeをに変更しscreenます。次の2つのいずれかを実行できます。

  1. の用語設定を変更します .screenrc
  2. あなたの修正.bashrcファイルが探しTERM=screenだけでなく、TERM=xterm

4
ありがとう!$HOME/.screenrcファイルを作成し、この行を先頭に追加しました:term xterm-colorand wa la!色プロンプトと$TERM値が一致します。ただし、タブ補完はありません...
thornomad

タブ補完をオンにするものを掘り下げる必要があります。デフォルトのシェル構成スクリプトは、それらが何に基づいて有効にするかについて完全に一貫していません$TERM。xtermとxterm-colorで有効になるものもあれば、xtermだけを探すものもあります。他のものには他のスイッチがあります。
-staticsan

11

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

これが私の発見です。まず、私は個人的にそれが面白く、ログインシェルと非ログインシェルの違いを知る価値があると感じています。a man $SHELLを実行し、INVOCATIONのセクションを検索して詳細を確認してください。

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

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

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

shell -$SHELL

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

defshell -bash

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


現在のディレクトリでシェルを起動する方法はありますか?私が望むものの例は以下cd ~/Projects ; screen ; pwd #=> ~/Projectsです。ただし、追加shell -$SHELLした後に得られるの~/.screenrccd ~/Projects ; screen ; pwd #=> ~/
-rudolph9

9

Bashの実行方法に応じて、ログインシェルを実行している場合があります。を実行するscreenと、非ログインの対話型シェルが実行されます。

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

  • /etc/bash.bashrc次に~/.bashrc、非ログインの対話型シェルが開始されたときにソースされます

  • /etc/profileその後、最初の発見~/.bash_profile~/.bash_loginおよび~/.profile対話型のログインシェルが起動されたときに供給されています

これはあなたに影響を与えている可能性があります。

また、$TERM異なるかどうかを確認します。


2

screenはbashを置き換えるものではなく、実行するものでも、他のシェルでもありません。多分それは実行しているcshzshまたはbashが異なる偶然に持ちます。

私がしようと最初にしてチェックすることですpsし、/proc/<pid>/cmdlineそれは同じパラメータで同じシェルを使っていることを確認するためにlogin行います。

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


私はpsコマンドを実行し、それbashが実行されていることを示しています(これは画面内のpsコマンドです)...色が機能するようになりました(上記)タブ補完が必要です。
thornomad

2

私は同じ問題を抱えていました。スクリーンを走らせたとき、私は巧妙に見つけたクールなPS1カラープロンプトを失いました:P。

問題は〜/ .bash_profileでこのように実行していたことです

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

つまり、画面が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\]\$ "

そのように、変数はネストされた実行で失われません。


1

「defshell -bash」について何かを追加したいだけです(数か月間頭を悩ませた後、私はこれを理解しました)。これを行うと、画面で実行される子シェルの$ 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の設定を間違えると他のものが壊れることを想像しますが、スクリプトは私が気づいたことです。


0

.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 }

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.