Bash-スクリプトでホスト名を変更した後、PS1が適切なホスト名で更新されない


11

これは、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がプロセスの開始時にメモリに格納され、起動後に変更できない可能性はありますか?


これはプログラミングに関するものではないため、ここではなく、他のstackexchangeサイトの1つに置く必要があります。ただし、PS1を他の文字列に変更してから再び元に戻すことで解決できるはずです。これにより、bashがホスト名を再度読み取るようになります。
Jonathan Wakely

1
あなたの現在$PS1を私たちと共有するつもりでしたか?
Ignacio Vazquez-Abrams、

1
まさに:PS1の内容は何ですか?echo "$ PS1" sb "[\ u @ \ h \ w] \ $"
Bruce

はい、私の$ PS1には\ hがあり、たまたま "[\ u @ \ h \ w] \ $"になっています。
ジョセフグローバー

以下の私のコメントからコピー...残念ながら、これ(。〜/ .bashrc)は何もしません。またexport PS1='somestring'; export PS1='[\u@\h \W]\$'、ターミナルのスクリプトの外で実行しようとしましたが、 'somestring'に切り替わりますが、ホスト名は変更されません。:\プロセスの開始時に\ hがメモリに保存され、起動後に変更できない可能性はありますか?
ジョセフグローバー、

回答:


7

PS1が次のような場合:

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

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

exec bash

bashを新しいインスタンスに置き換えます(\ hの値が更新されます)。悲しいことに、実行中のスクリプトを終了します。ホスト名の変更後にコードの実行に続くシェルスクリプトの変更を行うには、他にもいくつかの魔法が必要です。更新されたホスト名とで同じスクリプトを実行し続けることは不可能だと思います\h。しかし、私はそれがあなたが求めているものではないことも信じています。


1
したがって、これはおそらく、ターミナルを終了せずに機能にアクセスできる最も近いものです。残念ながら、bashの他のインスタンスは1レベル上に残っているため、ユーザーが終了すると、古いインスタンスに戻るため、古いホスト名に戻ります。ただし、起動時にのみ設定されることを確認していただきありがとうございます。そう考えていたのですが、よくわかりませんでした。これを確認するために私に指摘できるソースがありますか?ありがとう!
ジョセフグローバー

6

2つの問題

PS1は一度設定され、ホスト名が変更されたら再設定する必要があります。

スクリプトは次のように編集できます

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

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

. ./changehost newhostname

先頭のドットに注意してください。

先頭のドットを使用しない場合、PS1は新しい一時シェルに設定され、失われます。


bashが実行されると、ホスト名(ユーザー名)の値(/ h、/ uに格納されている)が更新されるかどうかは不明です。これらの値は変更される可能性が低いためです。

ただし、bashはPATHを処理します。


export PS1='[\u@'$(hostname)'\h \W]\$' $(ホスト名)の意味がわかりません。\ hはホスト名の短縮名である必要がありますね?
ジョセフグローバー

また、以前ははっきりしていなかったと思いexportますが、スクリプトの外部でスクリプトを実行したターミナルでも、更新されたPS1を取得できません。PS1は何でも問題なく変更できますが、\ h値は更新されません。
ジョセフグローバー

1

1)ホスト名を変更しなかった。ホスト名を変更したい場合は、以下を呼び出す必要があります。

uname -S newname

または

hostname newname

使用しているOSによって異なります。

2)bashがでホスト名を再度読み取るかどうかは不明\hです。現在のホスト名を常に表示したい場合は、次を呼び出します。

PS1="`hostname`'

そのため、実際にはを使用してホスト名を変更hostname newnameします。ソースを指定せずにスクリプトを実行した場合でも、呼び出し元のターミナルでは永続的です。実行export PS1='`hostname`'すると、PS1は新しいホスト名に正しく変更されますが、\h更新する変数を取得できない場合は、ユーザーにシェルを終了させるだけです。
ジョセフグローバー

0

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

PS1=$PS1

または

. ~/.bashrc

残念ながら、これは何もしません。またexport PS1='somestring'; export PS1='[\u@\h \W]\$'、ターミナルのスクリプトの外で実行しようとしましたが、 'somestring'に切り替わりますが、ホスト名は変更されません。:\プロセスの開始時に\ hがメモリに保存され、起動後に変更できない可能性はありますか?
ジョセフグローバー

@JosephGloverはい、おそらく起動時に読み込まれて保存されるため、別のシェルを起動して更新する必要があります。

0

hostname多くのオペレーティングシステムでは、ユーティリティを使用してシステムのホスト名を直接設定できますが、手動でファイルを編集する場合は、ここにスクリプトの拡張バージョンがあります。ユーザー引数の存在テスト、元のファイルのバックアップを追加し、スクリプトの最後にユーザーの.bashrcを提供しました。

#!/bin/bash 

# Error if anything goes wrong and report all commands
set -xe

# Test that the user supplied an argument
if [[ "$#" != 1 ]]
then printf "Usage: $0 <newhostname>\n"
     exit 1
fi

# Back up the files first (but don't clobber old backups).
cp -n /etc/hosts /etc/hosts.bak
cp -n /etc/sysconfig/network /etc/sysconfig/network.bak


# Do two seds 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

# Source the user's .bashrc file
. /home/$USER/.bashrc

私はそうしようとしましたが、ソーシングは何もしていません。
ジョセフグローバー

新しいインタラクティブシェルを起動すると、変更が反映されますか?bash -i

はい、変更が反映されます。
ジョセフグローバー

.bash_profileを試してみて、それが機能しない場合は、基本的に説明に値します。ほとんどのシステムは、初期の実行時に/ etc / profileをソースとして使用し、そこから他の構成ファイルをソースします。通常、ユーザーの/ homeのセットアップを完了するためのシェルrcまたはプロファイル、あるいはその両方で終了

.bash_profileファイルを入手しましたが、機能しません。また、rcファイルとプロファイルファイルがどのように機能するかについては、すでによく知っていますが、説明をありがとうございます。
ジョセフグローバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.