Bash - PS1 ไม่อัปเดตด้วยชื่อโฮสต์ที่เหมาะสมหลังจากเปลี่ยนชื่อโฮสต์ในสคริปต์


11

นี่เป็นสำเนาโพสต์ของฉันจาก stackoverflow ฉันรู้ว่าฉันควรถามที่นี่ ...

ฉันต้องการเรียกใช้สคริปต์ที่เปลี่ยนชื่อโฮสต์และอัพเดต bash prompt (ตัวแปร 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 อื่น ๆ ไม่ใช่ที่นี่ อย่างไรก็ตามคุณควรจะสามารถแก้ไขได้โดยเพียงแค่เปลี่ยน PS1 เป็นสตริงอื่นแล้วกลับมาอีกครั้งซึ่งจะทำให้ bash อ่านชื่อโฮสต์อีกครั้ง
Jonathan Wakely

1
คุณจะแบ่งปันข้อมูลปัจจุบันของคุณ$PS1กับเราหรือไม่
Ignacio Vazquez-Abrams

1
เผง: เนื้อหาของ PS1 คืออะไร echo "$ PS1" sb "[\ u @ \ h \ w] \ $"
Bruce

ใช่ $ PS1 ของฉันมี \ h อยู่และเป็น "[\ u @ \ h \ w] \ $" อย่างแน่นอน
Joseph Glover

คัดลอกจากความคิดเห็นของฉันด้านล่าง ... น่าเสียดายที่นี่ (. ~ / .bashrc) ไม่ได้ทำอะไรเลย ฉันได้ลองทำexport PS1='somestring'; export PS1='[\u@\h \W]\$'นอกสคริปต์ในเทอร์มินัลและเปลี่ยนเป็น 'somestring' และย้อนกลับ แต่ชื่อโฮสต์ไม่เปลี่ยนแปลง : \ เป็นไปได้หรือไม่ที่ \ h ถูกเก็บไว้ในหน่วยความจำเมื่อกระบวนการเริ่มต้นและไม่สามารถเปลี่ยนแปลงได้หลังจากเริ่มทำงาน?
Joseph Glover

คำตอบ:


7

หาก PS1 ของคุณคล้ายกับ:

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

ค่าของ \ h ถูกตั้งค่าเมื่อเริ่มต้น bash เท่านั้น ดังนั้นหากคุณเปลี่ยนชื่อโฮสต์คุณจะต้องเริ่มต้นอินสแตนซ์ bash ใหม่:

exec bash

จะแทนที่ bash ด้วยอินสแตนซ์ใหม่ (ด้วยค่าของ \ h ที่ได้รับการอัปเดต) น่าเศร้าที่มันจะออกจากสคริปต์ที่ทำงานอยู่ จำเป็นต้องใช้เวทมนต์อื่น ๆ เพื่อทำการเปลี่ยนแปลงสำหรับเชลล์สคริปต์ที่ตามหลังการเรียกใช้งานโค้ดหลังจากการเปลี่ยนชื่อโฮสต์ \hผมเชื่อว่ามันเป็นไปไม่ได้ที่จะให้สคริปต์เดียวกันการทำงานที่มีการปรับปรุงและชื่อโฮสต์ แต่ฉันก็เชื่อว่านั่นไม่ใช่สิ่งที่คุณต้องการ


1
ดังนั้นนี่อาจเป็นสิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถเข้าถึงการทำงานของฉันได้โดยไม่ต้องออกจากเครื่อง น่าเสียดายที่มันยังคงปล่อยอินสแตนซ์อื่นของการทุบตีขึ้นหนึ่งระดับดังนั้นเมื่อผู้ใช้ออกจากมันกลับสู่อินสแตนซ์เก่าและชื่อโฮสต์เก่า แต่ขอขอบคุณสำหรับการยืนยันว่ามีการตั้งค่าเมื่อเริ่มต้นเท่านั้น! นั่นคือสิ่งที่ฉันคิด แต่ก็ไม่แน่ใจ คุณมีแหล่งข้อมูลที่คุณสามารถชี้ให้ฉันยืนยันได้ไหม ขอบคุณ!
Joseph Glover

6

ปัญหาสองประการ

PS1 ถูกตั้งค่าครั้งเดียวคุณต้องตั้งค่าใหม่เมื่อชื่อโฮสต์ถูกเปลี่ยน

คุณสามารถแก้ไขสคริปต์ด้วย

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

ในตอนท้าย แต่สคริปต์ควรจะเรียกใช้เป็น

. ./changehost newhostname

สังเกตจุดนำ

หากคุณไม่ได้ใช้จุดนำ PS1 จะถูกตั้งค่าในเชลล์ชั่วคราวใหม่และหายไป


ไม่ชัดเจนหากค่า bash update ชื่อโฮสต์ (ชื่อผู้ใช้) (เก็บไว้ใน / h, / u) เมื่อมีการเรียกใช้เนื่องจากค่าเหล่านั้นไม่น่าจะเปลี่ยนแปลง

อย่างไรก็ตามทุบตีดูแลเส้นทาง


ฉันไม่เข้าใจexport PS1='[\u@'$(hostname)'\h \W]\$' จุดของ $ (ชื่อโฮสต์) คืออะไร? \ h ควรเป็นชื่อย่อของชื่อโฮสต์ถูกต้องหรือไม่
Joseph Glover

นอกจากนี้ฉันคิดว่าฉันยังไม่ชัดเจนมาก่อน แต่แม้จะทำexportนอกสคริปต์ในเทอร์มินัลที่ฉันเรียกใช้สคริปต์ฉันยังไม่ได้รับ PS1 ที่อัปเดต หมายเหตุฉันสามารถเปลี่ยน PS1 ให้เป็นอะไรก็ได้ แต่ค่า \ h นั้นไม่ได้รับการอัพเดต!
Joseph Glover

1

1) คุณไม่ได้เปลี่ยนชื่อโฮสต์ หากคุณต้องการเปลี่ยนชื่อโฮสต์คุณต้องโทร:

uname -S newname

หรือ

hostname newname

ขึ้นอยู่กับระบบปฏิบัติการที่คุณใช้

2) มันไม่ชัดเจนว่า bash อ่านชื่อโฮสต์ด้วย\hหรือไม่ หากคุณต้องการดูชื่อโฮสต์ปัจจุบันให้โทร:

PS1="`hostname`'

ดังนั้นฉันจึงเปลี่ยนชื่อโฮสต์การใช้hostname newnameและมันคงอยู่ในเทอร์มินัลการโทรถึงแม้ในขณะที่รันสคริปต์โดยไม่ต้องซื้อมัน การรันexport PS1='`hostname`'ไม่ถูกต้องเปลี่ยน PS1 เป็นชื่อโฮสต์ใหม่ แต่ถ้าฉันไม่สามารถรับ\hตัวแปรที่จะอัปเดตได้ฉันจะทำให้ผู้ใช้ออกจากเชลล์
Joseph Glover

0

ดูเหมือนว่าทุบตีจะไม่อ่านชื่อโฮสต์ปัจจุบันในแต่ละจอแสดงผลให้ดังนั้นคุณจะต้องบอกให้ทุบตีอ่านอีกครั้ง คุณสามารถลองด้วย:

PS1=$PS1

หรือ

. ~/.bashrc

น่าเสียดายที่นี่ไม่ได้ทำอะไรเลย ฉันได้ลองทำexport PS1='somestring'; export PS1='[\u@\h \W]\$'นอกสคริปต์ในเทอร์มินัลและเปลี่ยนเป็น 'somestring' และย้อนกลับ แต่ชื่อโฮสต์ไม่เปลี่ยนแปลง : \ เป็นไปได้หรือไม่ที่ \ h ถูกเก็บไว้ในหน่วยความจำเมื่อกระบวนการเริ่มต้นและไม่สามารถเปลี่ยนแปลงได้หลังจากเริ่มทำงาน?
Joseph Glover

@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

ฉันได้ลองแล้ว แต่การจัดหาดูเหมือนจะไม่ทำอะไรเลย
Joseph Glover

การเปลี่ยนแปลง refleced เมื่อคุณเริ่มเปลือกโต้ตอบใหม่หรือไม่? bash -i

ใช่การเปลี่ยนแปลงถูกสะท้อนออกมา
Joseph Glover

ลอง. bash_profile และหากไม่ได้ผลคุณจำเป็นต้องมีคำอธิบายเป็นอย่างยิ่ง: ระบบส่วนใหญ่จะเริ่มต้นด้วยการจัดหา / etc / profile ในช่วงเริ่มต้นทำงานและจากนั้นจะมีไฟล์การกำหนดค่าอื่นจำนวนเท่าใด โดยทั่วไปแล้วลงท้ายด้วย shell rc และ / หรือโปรไฟล์เพื่อจบการตั้งค่าของผู้ใช้ / home

ฉันได้จัดหาไฟล์. bash_profile ของฉันแล้วและมันไม่ทำงาน และฉันก็คุ้นเคยกับการทำงานของไฟล์ rc และโปรไฟล์แล้ว แต่ขอบคุณสำหรับคำอธิบาย
Joseph Glover
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.