Bash - PS1 tidak Memperbarui dengan Hostname Tepat setelah Perubahan Hostname di Script

11

Ini adalah salinan posting saya dari stackoverflow; Saya sadar saya seharusnya bertanya di sini ...

Saya ingin menjalankan skrip yang mengubah nama host dan segera meminta bash prompt (variabel PS1) dengan nama host yang tepat. Bagaimana saya mewujudkan ini?

Saya menjalankan ini

#!/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

Di terminal seperti ini dan dapatkan ini

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

Tapi yang saya inginkan adalah ini

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

Terminal diperbarui dengan benar hanya ketika saya membuka shell baru.

Saya juga coba lakukan

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

di luar skrip di terminal dan ia beralih ke 'somestring' dan kembali, tetapi nama host tidak berubah. : \

Apakah mungkin \ h disimpan dalam memori ketika proses dimulai dan tidak dapat diubah setelah startup?

Joseph Glover
sumber
Ini bukan tentang pemrograman, jadi harus di salah satu situs stackexchange lainnya, bukan di sini. Namun, Anda harus dapat menyelesaikannya dengan hanya mengubah PS1 ke beberapa string lain dan kemudian kembali lagi, yang akan menyebabkan bash membaca kembali nama host.
Jonathan Wakely
1
Apakah Anda akan membagikan arus Anda $PS1dengan kami?
Ignacio Vazquez-Abrams
1
Persis: apa isi PS1? echo "$ PS1" sb "[\ u @ \ h \ w] \ $"
Bruce
Ya, $ PS1 saya memiliki \ h di dalamnya, dan kebetulan persis "[\ u @ \ h \ w] \ $".
Joseph Glover
Salin dari komentar saya di bawah ... Sayangnya ini (. ~ / .Bashrc) tidak melakukan apa-apa. Saya juga mencoba melakukan di export PS1='somestring'; export PS1='[\u@\h \W]\$'luar skrip di terminal dan itu beralih ke 'somestring' dan kembali, tetapi nama host tidak berubah. : \ Apakah mungkin \ h disimpan dalam memori ketika proses dimulai dan tidak dapat diubah setelah startup?
Joseph Glover

Jawaban:

7

Jika PS1 Anda mirip dengan:

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

Nilai \ h hanya diset pada startup bash. Oleh karena itu, jika Anda mengubah nama host, Anda harus memulai contoh bash baru:

exec bash

Akan mengganti bash dengan instance baru (dengan nilai \ h diperbarui). Sayangnya, ini akan keluar dari skrip yang sedang berjalan. Beberapa keajaiban lain diperlukan untuk membuat perubahan untuk skrip shell yang mengikuti kode eksekusi setelah perubahan nama host. Saya percaya bahwa skrip yang sama tidak dapat tetap berjalan dengan nama host dan pembaruan \h. Tetapi saya juga percaya bahwa itu bukan yang Anda minta.


sumber
1
Jadi ini mungkin yang terdekat yang bisa saya dapatkan dengan fungsionalitas saya tanpa keluar dari terminal. Sayangnya itu masih meninggalkan instance lain dari bash satu level ke atas, jadi ketika pengguna keluar, ia kembali ke instance lama dan oleh karena itu nama host yang lama. Tetapi terima kasih atas konfirmasi bahwa ini hanya diset pada startup! Itulah yang saya pikirkan, tetapi saya tidak yakin. Apakah Anda memiliki sumber yang dapat Anda tunjuk untuk mengonfirmasi ini? Terima kasih!
Joseph Glover
6

dua masalah

PS1 diatur sekali, Anda harus mengatur ulang setelah nama host diubah.

Anda dapat mengedit skrip dengan

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

di akhir, tetapi skrip harus dijalankan sebagai

. ./changehost newhostname

perhatikan titik terkemuka.

Jika Anda tidak menggunakan titik awal, PS1 akan diatur dalam shell sementara baru dan hilang.


Tidak jelas apakah bash memperbarui nilai hostname (nama pengguna) (disimpan dalam / h, / u) setelah dijalankan karena nilai tersebut tidak mungkin berubah.

Namun bash menjaga PATH.

Archemar
sumber
Saya tidak mengerti. export PS1='[\u@'$(hostname)'\h \W]\$' Apa gunanya $ (nama host)? \ h harus menjadi nama pendek dari nama host, benar?
Joseph Glover
Juga, saya kira saya tidak jelas sebelumnya, tetapi bahkan melakukan di exportluar skrip, di terminal saya menjalankan skrip, saya masih tidak mendapatkan PS1 yang diperbarui. Catatan, saya dapat mengubah PS1 menjadi apa saja, tetapi nilai \ h tidak diperbarui!
Joseph Glover
1

1) Anda tidak mengubah nama host. Jika Anda benar-benar ingin mengubah nama host, Anda perlu menelepon:

uname -S newname

atau

hostname newname

tergantung pada OS yang Anda gunakan.

2) Tidak jelas apakah bash membaca ulang hostname \h. Jika Anda ingin selalu melihat nama host saat ini, hubungi:

PS1="`hostname`'
schily
sumber
Jadi saya benar-benar mengubah nama host, menggunakan hostname newname, dan itu tetap ada di terminal panggilan, bahkan ketika menjalankan skrip tanpa sumber itu. Menjalankan export PS1='`hostname`'tidak mengubah PS1 dengan benar menjadi nama host baru, tetapi jika saya tidak bisa mendapatkan \hvariabel untuk memperbarui, saya hanya akan mendapatkan pengguna untuk keluar dari shell.
Joseph Glover
0

Sepertinya bash tidak membaca nama host saat ini pada setiap tampilan prompt, jadi Anda harus memberi tahu bash untuk membacanya kembali. Anda dapat mencoba dengan:

PS1=$PS1

atau

. ~/.bashrc
Alvaro Gutierrez Perez
sumber
Sayangnya ini tidak melakukan apa-apa. Saya juga mencoba melakukan di export PS1='somestring'; export PS1='[\u@\h \W]\$'luar skrip di terminal dan itu beralih ke 'somestring' dan kembali, tetapi nama host tidak berubah. : \ Apakah mungkin \ h disimpan dalam memori ketika proses dimulai dan tidak dapat diubah setelah startup?
Joseph Glover
@JosephGlover Ya, mungkin itu dibaca saat diluncurkan dan disimpan, jadi Anda harus meluncurkan shell lain untuk memperbaruinya.
0

Dimungkinkan untuk menetapkan nama host sistem secara langsung dengan hostnameutilitas pada banyak sistem operasi, namun jika Anda memilih untuk mengedit file dengan tangan di sini adalah versi augmented dari skrip Anda. Saya menambahkan tes untuk keberadaan argumen pengguna, cadangan untuk file asli dan bersumber .bashrc pengguna di akhir skrip.

#!/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

sumber
Saya sudah mencoba seperti itu, tetapi sumber sepertinya tidak melakukan apa-apa.
Joseph Glover
Apakah perubahan direfleksikan ketika Anda memulai shell interaktif baru? bash -i
Ya, perubahannya tercermin.
Joseph Glover
Coba .bash_profile dan jika itu tidak berhasil maka pada dasarnya Anda layak mendapatkan penjelasan: Sebagian besar sistem akan mulai dengan sumber / etc / profile pada awal waktu berjalan dan kemudian dari sana mencari sejumlah file konfigurasi lainnya. umumnya diakhiri dengan shell rc dan / atau profil untuk menyelesaikan pengaturan pengguna / rumah
Saya telah mengambil file .bash_profile dan tidak berfungsi. Dan saya juga sudah terbiasa dengan cara kerja file profil dan rc, tapi terima kasih atas penjelasannya.
Joseph Glover