Bash - スクリプトでホスト名を変更した後、PS1は正しいホスト名で更新されません。

Bash - スクリプトでホスト名を変更した後、PS1は正しいホスト名で更新されません。

これはstackoverflowの私の投稿のコピーです。ここに質問する必要があることに気づきました...

ホスト名を変更し、bashプロンプト(PS1変数)を正しいホスト名にすぐに更新するスクリプトを実行したいと思います。どうすればいいですか?

私はこれを実行します

#!/bin/bash
# Usage: ./changehost <newhostname>

#Do two sed's to edit the files for persistent hostname change
sed -i s/$(hostname)/$1/g "/etc/hosts"
sed -i s/$(hostname)/$1/g "/etc/sysconfig/network"

#run the hostname command with new hostname to update it
hostname $1

こんな端末でこれを手に入れよう

[user@host dir]# ./changehost newhostname
[user@host dir]# 

ところで私が欲しいのはこれだ。

[user@host dir]# ./changehost newhostname
[user@newhostname dir]# 

新しいシェルを開くと、端末は正しく更新されます。

私もこれを試してみました。

export PS1='somestring'; export PS1='[\u@\h \W]\$' 

端末のスクリプトの外側では「somestring」に切り替え、その逆に切り替えますが、ホスト名は同じままです。 :\

プロセスの開始時に \h がメモリに保存され、起動後に変更できない可能性がありますか?

答え1

PS1が次の場合:

export PS1='[\u@\h \W]\$'

\ hの値は、bashが起動したときにのみ設定されます。したがって、ホスト名を変更する場合は、新しいbashインスタンスを起動する必要があります。

exec bash

bashを新しいインスタンスに置き換えます(\ h値を更新)。残念ながら、実行中のスクリプトは終了します。ホスト名が変更された後にコードを実行するシェルスクリプトを変更するには、いくつかの追加の魔法が必要です。私は更新されたホスト名を使用することはできないと思います\h。しかし、私はそれがあなたが要求するものではないと思います。

答え2

2つの質問

PS1は一度設定した後、ホスト名を変更してリセットする必要があります。

次のコマンドを使用してスクリプトを編集できます。

export PS1='[\u@'$(hostname)' \W]\$' 

最後に、スクリプトは次のように実行する必要があります。

. ./changehost newhostname

主なポイントに注意してください。

先行ポイントが使用されない場合、PS1は新しい一時シェルに設定され、失われます。


bashが実行後にホスト名(ユーザー名)の値(/ h、/ uに保存されている)を更新するかどうかはわかりません。これは変更される可能性が低いためです。

しかし、bashはPATHを管理します。

答え3

\hBashに翻訳された値を更新させる方法はありません。起動時に一度読み、それ以降は修正されません。したがって、更新されたヒントが必要な場合、唯一のオプションは次のとおりです。

  • サブシェルの開始 —bash
  • 現在のシェルを新しいシェルに置き換える —exec bash
  • PS1アップデート、次に\h置換$(hostname)またはリテラル文字列

さて、Bashの内部についてもっと学びましょう。ホスト名の値は、current_host_name次に定義された変数に保存されますshell.h:113

extern char *current_host_name;

3つの場所で使用されますvariables.c:695

temp_var = set_if_not ("HOSTNAME", current_host_name);

parse.y:6039:

case 'h':
case 'H':
  t_host = savestring (current_host_name);
  if (c == 'h' && (t = (char *)strchr (t_host, '.')))
...

そしてy.tab.c:8333

case 'h':
case 'H':
  t_host = savestring (current_host_name);
  if (c == 'h' && (t = (char *)strchr (t_host, '.')))
...

shell_initialize()次の関数で(空の文字列で初期化することに加えて)一度だけ割り当てますshell.c:1918

/* It's highly unlikely that this will change. */
if (current_host_name == 0)
  {
    /* Initialize current_host_name. */
    if (gethostname (hostname, 255) < 0)
      current_host_name = "??host??";
    else
      current_host_name = savestring (hostname);
  }

すべての行番号とファイル名はソースbash-5.1.tar.gzコードから取得されます。kernel.orgのミラーリング

答え4

bashはすべてのプロンプト表示で現在のホスト名を読み取っていないようです。bashに再度読み込むように指示する必要があります。あなたは試すことができます:

PS1=$PS1

または

. ~/.bashrc

関連情報