Bash - PS1 Komut Dosyasındaki Ana Makine Adı Değişikliğinden Sonra Uygun Ana Bilgisayar Adıyla Güncelleştirilmiyor


11

Bu yazı stackoverflow gelen benim bir kopyasıdır; Burada sormam gerektiğini anlıyorum ...

Ana bilgisayar adını değiştiren bir komut dosyası çalıştırmak ve bash istemim (PS1 değişkeni) hemen uygun ana bilgisayar adı ile güncellemek istiyorum. Bunu nasıl yapabilirim?

Bunu çalıştırıyorum

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

Böyle bir terminalde ve bunu elde et

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

Ama istediğim bu

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

Terminal yalnızca yeni bir kabuk açtığımda düzgün şekilde güncelleniyor.

Ben de yapmaya çalıştım

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

terminaldeki komut dosyasının dışında kalır ve 'somestring' ve geri dönüş yapar, ancak ana bilgisayar adı değişmez. : \

İşlem başladığında \ h belleğe kaydedilebilir ve başlatma işleminden sonra değiştirilemez mi?


Bu programlama ile ilgili değil, bu yüzden burada değil, diğer stackexchange sitelerinden birinde olmalıdır. Ancak, PS1'i başka bir dizeye değiştirip sonra tekrar geri döndürebilmeniz gerekir, bu da bash'ın ana makine adını yeniden okumasına neden olur.
Jonathan Wakely

1
Akımınızı $PS1bizimle paylaşacak mısınız?
Ignacio Vazquez-Abrams

1
Kesinlikle: PS1'in içeriği nedir? echo "$ PS1" sb "[\ u @ \ h \ w] \ $"
Bruce

Evet, $ PS1'imde \ h var ve tam olarak "[\ u @ \ h \ w] \ $" oluyor.
Joseph Glover

Aşağıdaki yorumumdan kopyala ... Maalesef bu (. ~ / .Bashrc) hiçbir şey yapmıyor. Ayrıca export PS1='somestring'; export PS1='[\u@\h \W]\$'terminalde komut dosyası dışında yapmaya çalıştım ve 'somestring' ve geri geçiş yapar, ancak ana bilgisayar adı değişmez. : \ İşlem başladığında \ h belleğe kaydedilebilir ve başlatma işleminden sonra değiştirilemez mi?
Joseph Glover

Yanıtlar:


7

PS1'iniz aşağıdakine benzerse:

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

\ H değeri yalnızca bash başlangıcında ayarlanır. Bu nedenle, ana bilgisayar adını değiştirirseniz, yeni bir bash örneği başlatmanız gerekir:

exec bash

Bash yerine yeni bir örnek gelecektir (\ h değeri güncellendi). Ne yazık ki, çalışan bir komut dosyasından çıkacaktır. Ana bilgisayar adı değişikliğinden sonra yürütme kodunu izleyen bir kabuk komut dosyasında değişiklik yapmak için başka bir sihir gerekir. Aynı komut dosyasını güncelleştirilmiş bir ana bilgisayar adı ile çalıştırmanın mümkün olmadığına inanıyorum ve \h. Ama aynı zamanda bunun istediğin şey olmadığına da inanıyorum.


1
Bu muhtemelen terminalden çıkmadan işlevselliğime ulaşabileceğim en yakın şey. Ne yazık ki, yine de bash'ın diğer örneğini bir seviye yukarı bırakır, bu nedenle kullanıcı çıktığında eski örneğe ve dolayısıyla eski ana makine adına döner. Ancak, yalnızca başlangıçta ayarlandığını doğruladığınız için teşekkürler! Ben de öyle düşünüyordum ama emin değildim. Bunu onaylamam için yönlendirebileceğiniz bir kaynağınız var mı? Teşekkürler!
Joseph Glover

7

iki problem

PS1 bir kez ayarlanır, ana bilgisayar adı değiştirildikten sonra yeniden ayarlamanız gerekir.

Komut dosyasını ile düzenleyebilirsiniz

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

ancak komut dosyası şu şekilde çalıştırılmalıdır:

. ./changehost newhostname

önde gelen noktayı not edin.

Baştaki noktayı kullanmazsanız, PS1 yeni bir geçici kabukta ayarlanır ve kaybolur.


Çalıştırıldıktan sonra bash güncelleme ana bilgisayar adı (kullanıcı adı) değerinin (/ h, / u içinde saklanır) değişip değişmediği açık değildir.

Ancak bash PATH ile ilgilenir.


Anlamıyorum export PS1='[\u@'$(hostname)'\h \W]\$' $ (hostname) anlamı nedir? \ h ana bilgisayar adının kısa adı olmalı, doğru mu?
Joseph Glover

Ayrıca, sanırım daha önce net değildim, ama exportsenaryo dışında bile , senaryoyu çalıştırdığım terminalde, hala güncellenmiş bir PS1 almıyorum. Not, PS1'i herhangi bir şeye iyi değiştirebilirim, ancak sadece \ h değeri güncellenmez!
Joseph Glover

1

1) ana bilgisayar adını değiştirmediniz. Ana bilgisayar adını gerçekten değiştirmek istiyorsanız, şunu aramanız gerekir:

uname -S newname

veya

hostname newname

kullandığınız işletim sistemine bağlı olarak.

2) bash'ın anasistem adını yeniden okuyup okumadığına dair bir şey yoktur \h. Mevcut ana bilgisayar adını her zaman görmek istiyorsanız arayın:

PS1="`hostname`'

Bu yüzden aslında, kullanarak ana bilgisayar adını değiştirmek hostname newnameve komut dosyası kaynak olmadan çalıştırırken bile, arama terminalinde kalıcıdır. Koşu export PS1='`hostname`', PS1'i yeni ana bilgisayar adına düzgün bir şekilde değiştirir, ancak \hdeğişkenin güncellenmesini sağlayamazsam , kullanıcının kabuktan çıkmasını sağlayacağım.
Joseph Glover

0

Görünüşe göre bash her istem ekranında mevcut ana bilgisayar adını okumuyor, bu yüzden bash'a yeniden okumasını söylemelisiniz. Şunları deneyebilirsiniz:

PS1=$PS1

veya

. ~/.bashrc

Ne yazık ki bu hiçbir şey yapmıyor. Ayrıca export PS1='somestring'; export PS1='[\u@\h \W]\$'terminalde komut dosyası dışında yapmaya çalıştım ve 'somestring' ve geri geçiş yapar, ancak ana bilgisayar adı değişmez. : \ İşlem başladığında \ h belleğe kaydedilebilir ve başlatma işleminden sonra değiştirilemez mi?
Joseph Glover

@JosephGlover Evet, belki de açılışta okunur ve saklanır, böylece güncellenmesi için başka bir kabuk başlatmanız gerekir.

0

Bir sistemin ana bilgisayar adını hostnamebirçok işletim sistemindeki yardımcı programla doğrudan ayarlamak mümkündür , ancak dosyaları elle düzenlemeyi seçerseniz, komut dosyanızın artırılmış bir sürümüdür. Kullanıcı argümanlarının varlığı için bir test ekledim, orijinal dosyalar için yedeklemeler yaptım ve komut dosyasının sonuna kullanıcının .bashrc kaynağını sağladım.

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

Ben böyle denedim, ama kaynak bir şey yapmak gibi görünmüyor.
Joseph Glover

Yeni bir etkileşimli kabuk başlattığınızda değişiklik yansıtılıyor mu? bash -i

Evet, değişiklik yansıtılır.
Joseph Glover

.Bash_profile komutunu deneyin ve bu işe yaramazsa, esasen bir açıklamayı hak edersiniz: Çoğu sistem / etc / profile kaynağını erken çalıştırma zamanında ve oradan da başka sayıda yapılandırma dosyasıyla başlar. genellikle kullanıcının / evinin kurulumunu tamamlamak için kabuk rc ve / veya profil ile biter

.Bash_profile dosyamı sağladım ve çalışmıyor. Ayrıca, rc ve profil dosyalarının nasıl çalıştığını zaten biliyorum, ancak açıklama için teşekkür ederim.
Joseph Glover
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.