Bash - PS1 không cập nhật với tên máy chủ phù hợp sau khi thay đổi tên máy chủ trong tập lệnh


11

Đây là một bản sao của bài viết của tôi từ stackoverflow; Tôi nhận ra rằng tôi nên đã hỏi nó ở đây ...

Tôi muốn chạy tập lệnh thay đổi tên máy chủ và cập nhật dấu nhắc bash (biến PS1) ngay lập tức với tên máy chủ phù hợp. Làm thế nào để tôi thực hiện điều này xảy ra?

Tôi chạy cái này

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

Trong một thiết bị đầu cuối như vậy và có được điều này

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

Nhưng điều tôi muốn là đây

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

Thiết bị đầu cuối được cập nhật đúng cách chỉ khi tôi mở một vỏ mới.

Tôi cũng đã cố gắng làm

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

bên ngoài tập lệnh trong thiết bị đầu cuối và nó chuyển sang 'nội địa hóa' và quay lại, nhưng tên máy chủ không thay đổi. : \

Có thể là \ h được lưu trong bộ nhớ khi quá trình bắt đầu và không thể thay đổi sau khi khởi động?


Đây không phải là về lập trình, vì vậy nên có trên một trong những trang web stackexchange khác, không phải ở đây. Tuy nhiên, bạn sẽ có thể giải quyết nó bằng cách thay đổi PS1 thành một chuỗi khác và sau đó quay lại, điều này sẽ khiến bash đọc lại tên máy chủ.
Jonathan Wakely 2/10/2015

1
Bạn sẽ chia sẻ hiện tại của bạn $PS1với chúng tôi?
Ignacio Vazquez-Abrams

1
Chính xác: nội dung của PS1 là gì? tiếng vang "$ PS1" sb "[\ u @ \ h \ w] \ $"
Bruce

Có, $ PS1 của tôi có \ h trong đó và chính xác là "[\ u @ \ h \ w] \ $".
Joseph Glover

Sao chép từ nhận xét của tôi bên dưới ... Thật không may, điều này (. ~ / .Bashrc) không làm gì cả. Tôi cũng đã cố gắng thực hiện export PS1='somestring'; export PS1='[\u@\h \W]\$'bên ngoài tập lệnh trong thiết bị đầu cuối và nó chuyển sang 'somestring' và quay lại, nhưng tên máy chủ không thay đổi. : \ Có thể là \ h được lưu trong bộ nhớ khi quá trình bắt đầu và không thể thay đổi sau khi khởi động không?
Joseph Glover

Câu trả lời:


7

Nếu PS1 của bạn tương tự như:

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

Giá trị của \ h chỉ được đặt khi khởi động bash. Do đó, nếu bạn thay đổi tên máy chủ, bạn cần bắt đầu một ví dụ bash mới:

exec bash

Sẽ thay thế bash bằng một phiên bản mới (với giá trị \ h được cập nhật). Đáng buồn thay, nó sẽ thoát khỏi một kịch bản đang chạy. Một số phép thuật khác là cần thiết để thực hiện thay đổi cho tập lệnh shell theo mã thực thi sau khi thay đổi tên máy chủ. Tôi tin rằng không thể giữ cùng một tập lệnh chạy với tên máy chủ được cập nhật và \h. Nhưng tôi cũng tin rằng đó không phải là điều bạn đang yêu cầu.


1
Vì vậy, đây có lẽ là chức năng gần nhất mà tôi có thể nhận được mà không cần thoát khỏi thiết bị đầu cuối. Thật không may, nó vẫn để lại một thể hiện khác của bash lên một cấp, vì vậy khi người dùng thoát nó sẽ trở về thể hiện cũ và do đó tên máy chủ cũ. Nhưng cảm ơn vì đã xác nhận rằng nó chỉ được thiết lập khi khởi động! Đó là những gì tôi đã nghĩ, nhưng tôi không chắc chắn. Bạn có một nguồn mà bạn có thể chỉ cho tôi để xác nhận điều này? Cảm ơn!
Joseph Glover

6

hai vấn đề

PS1 được đặt một lần, bạn phải đặt lại sau khi tên máy chủ được thay đổi.

Bạn có thể chỉnh sửa tập lệnh với

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

ở cuối, nhưng kịch bản nên được chạy như

. ./changehost newhostname

lưu ý dấu chấm hàng đầu.

Nếu bạn không sử dụng dấu chấm hàng đầu, PS1 sẽ được đặt trong một vỏ tạm thời mới và bị mất.


Không rõ giá trị bash update tên máy chủ (tên người dùng) (được lưu trữ trong / h, / u) một khi nó đang chạy vì những giá trị đó không có khả năng thay đổi.

Tuy nhiên bash hãy chăm sóc PATH.


Tôi không hiểu export PS1='[\u@'$(hostname)'\h \W]\$' điểm của $ (tên máy chủ) là gì? \ h nên là tên viết tắt của tên máy chủ, đúng không?
Joseph Glover

Ngoài ra, tôi đoán rằng tôi đã không rõ ràng trước đó, nhưng ngay cả khi thực hiện exportbên ngoài tập lệnh, trong thiết bị đầu cuối mà tôi đã chạy tập lệnh, tôi vẫn không nhận được bản PS1 cập nhật. Lưu ý, tôi có thể thay đổi PS1 tốt thành bất cứ điều gì, nhưng đơn giản là giá trị \ h không được cập nhật!
Joseph Glover

1

1) bạn đã không thay đổi tên máy chủ. Nếu bạn thực sự muốn thay đổi tên máy chủ, bạn cần gọi:

uname -S newname

hoặc là

hostname newname

tùy thuộc vào hệ điều hành bạn đang sử dụng.

2) Không rõ liệu bash có đọc lại tên máy chủ hay không \h. Nếu bạn muốn luôn thấy tên máy chủ hiện tại, hãy gọi:

PS1="`hostname`'

Vì vậy, tôi thực sự thay đổi tên máy chủ, sử dụng hostname newnamevà nó vẫn tồn tại trong thiết bị đầu cuối cuộc gọi, ngay cả khi chạy tập lệnh mà không tìm nguồn cung ứng. Chạy export PS1='`hostname`'không thay đổi đúng PS1 thành tên máy chủ mới, nhưng nếu tôi không thể lấy \hbiến để cập nhật, tôi sẽ chỉ cho người dùng thoát khỏi trình bao.
Joseph Glover

0

Có vẻ như bash không đọc tên máy chủ hiện tại trên mỗi màn hình nhắc nhở, vì vậy bạn sẽ cần nói với bash để đọc lại nó. Bạn có thể thử với:

PS1=$PS1

hoặc là

. ~/.bashrc

Thật không may, điều này không làm gì cả. Tôi cũng đã cố gắng thực hiện export PS1='somestring'; export PS1='[\u@\h \W]\$'bên ngoài tập lệnh trong thiết bị đầu cuối và nó chuyển sang 'somestring' và quay lại, nhưng tên máy chủ không thay đổi. : \ Có thể là \ h được lưu trong bộ nhớ khi quá trình bắt đầu và không thể thay đổi sau khi khởi động không?
Joseph Glover

@JosephGlover Có, có thể nó được đọc khi khởi chạy và được lưu trữ, vì vậy bạn sẽ cần khởi chạy một shell khác để cập nhật nó.

0

Có thể đặt tên máy chủ của hệ thống trực tiếp với hostnametiện ích trên nhiều hệ điều hành, tuy nhiên nếu bạn chọn chỉnh sửa các tệp bằng tay thì đây là phiên bản tăng cường của tập lệnh của bạn. Tôi đã thêm một bài kiểm tra cho sự tồn tại của các đối số người dùng, các bản sao lưu cho các tệp gốc và lấy nguồn .bashrc của người dùng ở cuối tập lệnh.

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

Tôi đã cố gắng như vậy, nhưng tìm nguồn cung ứng dường như không làm gì cả.
Joseph Glover

Là sự thay đổi được phản ánh khi bạn bắt đầu một vỏ tương tác mới? bash -i

Vâng, sự thay đổi được phản ánh.
Joseph Glover

Hãy thử .bash_profile và nếu điều đó không hoạt động thì về cơ bản bạn xứng đáng được giải thích: Hầu hết các hệ thống sẽ bắt đầu bằng cách tìm nguồn / etc / profile trong thời gian đầu và sau đó lấy bất kỳ số lượng tệp cấu hình nào khác. thường kết thúc với shell RC và / hoặc hồ sơ để hoàn tất thiết lập của người dùng / nhà

Tôi đã cung cấp tệp .bash_profile của mình và nó không hoạt động. Và tôi cũng đã quen thuộc với cách các tệp RC và hồ sơ hoạt động, nhưng cảm ơn bạn đã giải thích.
Joseph Glover
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.