बैश - PS1 स्क्रिप्ट में होस्टनाम परिवर्तन के बाद उचित होस्टनाम के साथ अद्यतन नहीं


11

यह स्टैकओवरफ़्लो से मेरे पोस्ट की एक प्रति है; मुझे एहसास है कि मुझे इसे यहाँ पूछना चाहिए था ...

मैं एक स्क्रिप्ट चलाना चाहता हूं जो होस्टनाम को बदलता है और मेरे बैश प्रॉम्प्ट (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 संग्रहीत किया जाता है और स्टार्टअप के बाद बदला नहीं जा सकता है?


यह प्रोग्रामिंग के बारे में नहीं है, इसलिए अन्य स्टैकटेक्सचेंज साइटों में से एक पर होना चाहिए, यहां नहीं। हालाँकि, आपको इसे PS1 को किसी अन्य स्ट्रिंग में बदलकर और फिर से वापस हल करने में सक्षम होना चाहिए, जिससे होस्टनाम को फिर से पढ़ने के लिए बैश हो जाएगा।
जोनाथन वेकली

1
क्या आप $PS1हमारे साथ अपना करंट साझा करने जा रहे थे ?
इग्नासियो वाज़केज़-अब्राम्स

1
वास्तव में: PS1 की सामग्री क्या है? इको "$ PS1" sb "[\ u @ \ h \ w] \ $"
ब्रूस

हां, मेरे $ PS1 में \ h है, और वास्तव में "[\ u @ \ h \ w] \" है।
जोसेफ ग्लोवर

मेरी टिप्पणी से कॉपी करें ... दुर्भाग्य से यह (। ~ / .Bashrc) कुछ भी नहीं करता है। मैंने export PS1='somestring'; export PS1='[\u@\h \W]\$'टर्मिनल में स्क्रिप्ट के बाहर भी करने की कोशिश की है और यह 'somestring' और वापस स्विच करता है, लेकिन होस्टनाम अपरिवर्तित है। : क्या यह संभव है कि प्रक्रिया शुरू होने पर मेमोरी में \ h संग्रहीत किया जाता है और स्टार्टअप के बाद बदला नहीं जा सकता?
जोसेफ ग्लोवर

जवाबों:


7

यदि आपका PS1 इसके समान है:

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

\ H का मान केवल बैश स्टार्टअप पर सेट किया गया है। इसलिए, यदि आप hostname बदलते हैं, तो आपको एक नया बैश इंस्टेंस शुरू करने की आवश्यकता है:

exec bash

बैश को एक नए उदाहरण (\ h अद्यतन के मूल्य के साथ) से बदल देगा। अफसोस की बात है, यह एक स्क्रिप्ट चलाने से बाहर निकल जाएगा। शेल स्क्रिप्ट के लिए परिवर्तन करने के लिए कुछ अन्य जादू की आवश्यकता होती है जो होस्टनाम परिवर्तन के बाद निष्पादन कोड का पालन करते हैं। मेरा मानना ​​है कि एक अद्यतन स्क्रिप्टनाम के साथ एक ही स्क्रिप्ट को चालू रखना संभव नहीं है और \h। लेकिन मैं यह भी मानता हूं कि आप जो पूछ रहे हैं, वह वैसा नहीं है।


1
तो यह संभवतः निकटतम है जो मैं टर्मिनल से बाहर निकलने के बिना अपनी कार्यक्षमता के लिए प्राप्त कर सकता हूं। दुर्भाग्य से यह अभी भी एक स्तर को कोसने के अन्य उदाहरण को छोड़ देता है, इसलिए जब उपयोगकर्ता बाहर निकलता है तो यह पुराने उदाहरण और इसलिए पुराने होस्टनाम पर लौटता है। लेकिन पुष्टि के लिए धन्यवाद कि यह केवल स्टार्टअप पर सेट है! यही मैं सोच रहा था, लेकिन मुझे यकीन नहीं था। क्या आपके पास कोई स्रोत है जो आप मुझे इस बात की पुष्टि करने के लिए कह सकते हैं? धन्यवाद!
जोसेफ ग्लोवर

6

दो समस्याएं

PS1 को एक बार सेट किया गया है, होस्टनाम बदलने के बाद आपको फिर से सेट करना होगा।

आप स्क्रिप्ट को संपादित कर सकते हैं

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

अंत में, लेकिन स्क्रिप्ट को इस तरह चलाया जाना चाहिए

. ./changehost newhostname

प्रमुख बिंदु पर ध्यान दें।

यदि आप अग्रणी बिंदु का उपयोग नहीं करते हैं, तो PS1 एक नए अस्थायी शेल में सेट किया जाएगा और खो जाएगा।


यह स्पष्ट नहीं है कि यदि bash अपडेट होस्टनाम (उपयोगकर्ता नाम) मान (इन / एच, / यू में संग्रहीत) एक बार चल रहा है, क्योंकि यह मान बदलने की संभावना नहीं है।

हालांकि बैश PATH का ख्याल रखें।


मुझे समझ में नहीं आया export PS1='[\u@'$(hostname)'\h \W]\$' कि $ (hostname) का क्या मतलब है? होस्टनाम का शार्टकट सही होना चाहिए?
जोसेफ ग्लोवर

इसके अलावा, मुझे लगता है कि मैं पहले स्पष्ट नहीं था, लेकिन exportस्क्रिप्ट के बाहर भी , टर्मिनल में जो मैंने स्क्रिप्ट चलाई, मुझे अभी भी एक अद्यतन PS1 नहीं मिला। ध्यान दें, मैं PS1 को कुछ भी ठीक कर सकता हूं, लेकिन बस \ h मूल्य अपडेट नहीं किया जाता है!
जोसेफ ग्लोवर

1

1) आपने hostname नहीं बदला। यदि आप वास्तव में hostname बदलना चाहते हैं, तो आपको कॉल करने की आवश्यकता है:

uname -S newname

या

hostname newname

आपके द्वारा उपयोग किए जा रहे OS पर निर्भर करता है

2) यह स्पष्ट नहीं है कि क्या बैश होस्टनाम के साथ फिर से जुड़ जाता है \h। यदि आप हमेशा वर्तमान होस्टनाम देखना चाहते हैं, तो कॉल करें:

PS1="`hostname`'

इसलिए मैं वास्तव में होस्टनाम को बदल देता हूं, उपयोग कर रहा हूं hostname newname, और यह कॉल टर्मिनल में लगातार है, यहां तक ​​कि स्क्रिप्ट को बिना सोर्स किए भी चला रहा है। रनिंग export PS1='`hostname`'PS1 को नए होस्टनाम में ठीक से बदल देता है, लेकिन अगर मुझे \hअपडेट करने के लिए वैरिएबल नहीं मिल सकता है, तो मुझे केवल शेल से बाहर निकलने के लिए उपयोगकर्ता मिलेगा।
जोसफ ग्लोवर

0

ऐसा लगता है कि बैश प्रत्येक शीघ्र प्रदर्शन पर वर्तमान होस्टनाम नहीं पढ़ रहा है, इसलिए आपको इसे फिर से पढ़ने के लिए बैश को बताने की आवश्यकता होगी। आप के साथ कोशिश कर सकते हैं:

PS1=$PS1

या

. ~/.bashrc

दुर्भाग्य से यह कुछ भी नहीं करता है। मैंने export PS1='somestring'; export PS1='[\u@\h \W]\$'टर्मिनल में स्क्रिप्ट के बाहर भी करने की कोशिश की है और यह 'somestring' और वापस स्विच करता है, लेकिन होस्टनाम अपरिवर्तित है। : क्या यह संभव है कि प्रक्रिया शुरू होने पर मेमोरी में \ h संग्रहीत किया जाता है और स्टार्टअप के बाद बदला नहीं जा सकता?
जोसफ ग्लोवर

@JosephGlover हां, शायद यह लॉन्च और संग्रहित पर पढ़ा जाता है, इसलिए आपको इसे अपडेट करने के लिए एक और शेल लॉन्च करना होगा।

0

hostnameकई ऑपरेटिंग सिस्टम पर उपयोगिता के साथ सिस्टम के होस्टनाम को सीधे सेट करना संभव है , हालांकि यदि आप फ़ाइलों को हाथ से संपादित करना चुनते हैं तो यह आपकी स्क्रिप्ट का संवर्धित संस्करण है। मैंने उपयोगकर्ता तर्कों के अस्तित्व के लिए एक परीक्षण जोड़ा, मूल फाइलों के लिए बैकअप और स्क्रिप्ट के अंत में उपयोगकर्ता।

#!/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 आज़माएं और अगर वह काम नहीं करता है, तो अनिवार्य रूप से आप एक स्पष्टीकरण के लायक हैं: अधिकांश सिस्टम शुरुआती समय में सोर्सिंग / आदि / प्रोफ़ाइल से शुरू होंगे और फिर वहाँ से किसी भी अन्य कॉन्फ़िगरेशन फ़ाइलों की संख्या। आम तौर पर शेल आरसी और / या प्रोफाइल के साथ समाप्त होता है उपयोगकर्ता / घर के सेटअप को अंतिम रूप देने के लिए

मेरे पास मेरी .bash_profile फ़ाइल है और यह काम नहीं करती है। और मैं पहले से ही परिचित हूं कि आरसी और प्रोफाइल फाइलें कैसे काम करती हैं, लेकिन स्पष्टीकरण के लिए धन्यवाद।
जोसफ ग्लोवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.