বাশ - PS1 স্ক্রিপ্টে হোস্ট-নেম পরিবর্তনের পরে যথাযথ হোস্টনামের সাথে আপডেট হচ্ছে না


11

এটি স্ট্যাকওভারফ্লো থেকে আমার পোস্টের একটি অনুলিপি; আমি বুঝতে পারি আমার এখানে এটি জিজ্ঞাসা করা উচিত ...

আমি এমন একটি স্ক্রিপ্ট চালাতে চাই যা হোস্টনাম পরিবর্তন করে এবং যথাযথ হোস্টনামের সাথে সাথে আমার ব্যাশ প্রম্পট (পিএস 1 ভেরিয়েবল) আপডেট করতে পারে। আমি এটি কীভাবে করব?

আমি এই চালাতে

#!/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]\$' 

টার্মিনালে স্ক্রিপ্টের বাইরে এবং এটি 'সামস্ট্রিং' এবং পিছনে স্যুইচ করে না, তবে হোস্টের নামটি অপরিবর্তিত। : \

প্রক্রিয়াটি শুরু হওয়ার পরে মেমরির মধ্যে memory এইচ সংরক্ষণ করা সম্ভব এবং প্রারম্ভের পরে পরিবর্তন করা যায় না এটি কি সম্ভব?


এটি প্রোগ্রামিং সম্পর্কে নয়, সুতরাং অন্য স্ট্যাকেক্সচেঞ্জ সাইটের মধ্যে একটি হওয়া উচিত, এখানে নয়। যাইহোক, আপনার PS1 কে অন্য কোনও স্ট্রিংয়ে কেবল আবার পরিবর্তন করে এটি সমাধান করতে সক্ষম হওয়া উচিত যা হোস্টের নামটি পুনরায় পড়তে বাশ তৈরি করবে।
জোনাথন ওয়াকলি

1
আপনি কি $PS1আমাদের সাথে আপনার বর্তমান ভাগ করতে যাচ্ছেন ?
Ignacio Vazquez-Abram

1
ঠিক: পিএস 1 এর বিষয়বস্তু কী? প্রতিধ্বনি "$ পিএস 1" এসবি "[\ u @ \ এইচ] ডাব্লু] \ $"
ব্রুস 23

হ্যাঁ, আমার $ PS1 এর মধ্যে \ এইচ রয়েছে এবং এটি "[\ u @ \ h \ w] \ $" হ'ল।
জোসেফ গ্লোভার

নীচে আমার মন্তব্য থেকে অনুলিপি করুন ... দুর্ভাগ্যক্রমে এটি (। ~ / .Bashrc) কিছুই করে না। আমি export PS1='somestring'; export PS1='[\u@\h \W]\$'টার্মিনালে স্ক্রিপ্টের বাইরেও চেষ্টা করেছি এবং এটি 'সামস্ট্রিং' এবং পিছনে স্যুইচ করে তবে হোস্টের নামটি অপরিবর্তিত। : Process প্রক্রিয়া শুরু হওয়ার পরে এবং \ এইচটি মেমরির মধ্যে সঞ্চিত থাকে এবং প্রারম্ভের পরে পরিবর্তন করা যায় না?
জোসেফ গ্লোভার

উত্তর:


7

যদি আপনার PS1 এর মতো হয়:

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

\ H এর মানটি কেবলমাত্র ব্যাশ স্টার্টআপে সেট করা থাকে। অতএব, আপনি যদি হোস্টনামটি পরিবর্তন করেন তবে আপনাকে একটি নতুন বাশ উদাহরণ শুরু করতে হবে:

exec bash

নতুন দৃষ্টান্তে বাশকে প্রতিস্থাপন করবে (\ এইচ এর মান আপডেট করা হয়েছে)। দুঃখের বিষয়, এটি একটি চলমান স্ক্রিপ্ট থেকে প্রস্থান করবে। হোস্ট-নেম পরিবর্তনের পরে এক্সিকিউটিভ কোড অনুসরণকারী শেল স্ক্রিপ্টের জন্য পরিবর্তন করার জন্য অন্য কিছু যাদু প্রয়োজন। আমি বিশ্বাস করি যে একই স্ক্রিপ্টটি কোনও আপডেট হওয়া হোস্টনাম এবং দিয়ে চালানো সম্ভব নয় \h। তবে আমি এটিও বিশ্বাস করি যে আপনি যা চাইছেন তা তা নয়।


1
সুতরাং এটি সম্ভবত টার্মিনালটি ছাড়াই আমার কার্যকারিতাটিতে সবচেয়ে কাছের। দুর্ভাগ্যক্রমে এটি এখনও ব্যাশের অন্যান্য উদাহরণটিকে এক স্তর উপরে ছেড়ে যায়, তাই যখন ব্যবহারকারীটি প্রস্থান করে এটি পুরানো উদাহরণ এবং সেইজন্য পুরানো হোস্টনামে ফিরে আসে। তবে এটি নিশ্চিত করার জন্য ধন্যবাদ যে এটি কেবল স্টার্টআপে সেট করা আছে! এটাই আমি ভাবছিলাম, তবে আমি নিশ্চিত ছিলাম না। আপনার কাছে এমন কোনও উত্স আছে যা আপনি আমাকে এটি নিশ্চিত করতে ইঙ্গিত করতে পারেন? ধন্যবাদ!
জোসেফ গ্লোভার

6

দুটি সমস্যা

পিএস 1 একবার সেট হয়ে গেছে, হোস্টনাম পরিবর্তন হয়ে গেলে আপনাকে পুনরায় সেট করতে হবে।

আপনি স্ক্রিপ্টটি সম্পাদনা করতে পারেন

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

শেষে, তবে স্ক্রিপ্টটি চালানো উচিত

. ./changehost newhostname

নেতৃস্থানীয় বিন্দু নোট করুন।

আপনি যদি শীর্ষস্থানীয় ডট ব্যবহার না করেন, PS1 একটি নতুন অস্থায়ী শেলের মধ্যে সেট হয়ে যাবে এবং হারিয়ে যাবে।


এটি স্পষ্ট নয় যে বাশ আপডেট হোস্টনাম (ব্যবহারকারীর নাম) মান (/ h, / u তে সঞ্চিত) এটির মানটি পরিবর্তিত হওয়ার সম্ভাবনা কম থাকায় এটি চলমান হয় কিনা।

তবে বাশ PATH এর যত্ন নেবে।


আমি বুঝতে পারছি না export PS1='[\u@'$(hostname)'\h \W]\$' $ (হোস্ট নেম) এর বিন্দুটি কী? \ h হোস্টনামের সংক্ষিপ্ত নাম হওয়া উচিত, সঠিক?
জোসেফ গ্লোভার

এছাড়াও, আমি অনুমান করি যে আমি আগে পরিষ্কার ছিলাম না, এমনকি exportস্ক্রিপ্টের বাইরেও, টার্মিনালে যে আমি স্ক্রিপ্টটি চালিয়েছি, আমি এখনও একটি আপডেট পিএস 1 পাই না। দ্রষ্টব্য, আমি PS1 কে ঠিক কিছুতে জরিমানা করতে পারি তবে কেবল \ h মান আপডেট হয় না!
জোসেফ গ্লোভার

1

1) আপনি হোস্টের নাম পরিবর্তন করেন নি। আপনি যদি সত্যিই হোস্ট-নেম পরিবর্তন করতে চান তবে আপনাকে কল করতে হবে:

uname -S newname

অথবা

hostname newname

আপনি যে ওএস ব্যবহার করছেন তার উপর নির্ভর করে।

2) বাশ হোস্ট-এর সাথে পুনরায় পাঠ করে কিনা তা স্পষ্ট নয় \h। আপনি যদি সর্বদা বর্তমান হোস্টনামটি দেখতে চান তবে কল করুন:

PS1="`hostname`'

সুতরাং আমি হোস্টনামটি ব্যবহার করে বাস্তবে পরিবর্তন করি hostname newnameএবং এটি কলিং টার্মিনালে অবিরাম থাকে, এমনকি স্ক্রিপ্টটি না চালিয়ে চালিত করার পরেও। চলমান export PS1='`hostname`'PS1 কে সঠিকভাবে নতুন হোস্টনামে পরিবর্তন করে, তবে আমি যদি \hপরিবর্তনটি পরিবর্তন করতে না পারি তবে আমি কেবল শেলটি থেকে বেরিয়ে আসব।
জোসেফ গ্লোভার

0

দেখে মনে হচ্ছে বাশ প্রতিটি প্রম্পট ডিসপ্লেতে বর্তমান হোস্টনামটি পড়ছে না, তাই আপনাকে পুনরায় পড়ার জন্য বাশকে বলতে হবে। আপনি এটি দিয়ে চেষ্টা করতে পারেন:

PS1=$PS1

অথবা

. ~/.bashrc

দুর্ভাগ্যক্রমে এটি কিছুই করে না। আমি export PS1='somestring'; export PS1='[\u@\h \W]\$'টার্মিনালে স্ক্রিপ্টের বাইরেও চেষ্টা করেছি এবং এটি 'সামস্ট্রিং' এবং পিছনে স্যুইচ করে তবে হোস্টের নামটি অপরিবর্তিত। : Process প্রক্রিয়া শুরু হওয়ার পরে এবং \ এইচটি মেমরির মধ্যে সঞ্চিত থাকে এবং প্রারম্ভের পরে পরিবর্তন করা যায় না?
জোসেফ গ্লোভার

@ জোসেফগ্লোভার হ্যাঁ, সম্ভবত এটি লঞ্চে পড়ে এবং সংরক্ষণ করা হয়েছে, সুতরাং এটি আপডেট করার জন্য আপনাকে অন্য শেলটি চালু করতে হবে।

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

আমি এরকম চেষ্টা করেছি, তবে সোর্সিং কিছু করার মনে হচ্ছে না।
জোসেফ গ্লোভার

আপনি যখন একটি নতুন ইন্টারেক্টিভ শেল শুরু করবেন তখন কি পরিবর্তনটি প্রতিশোধিত হবে? bash -i

হ্যাঁ, পরিবর্তিত প্রতিফলিত হয়।
জোসেফ গ্লোভার

.Bash_profile ব্যবহার করে দেখুন এবং যদি এটি কাজ না করে তবে মূলত আপনার ব্যাখ্যার প্রাপ্য: বেশিরভাগ সিস্টেমে প্রাথমিকভাবে চালানো সময়ে / ইত্যাদি / প্রোফাইল সঞ্চার করা শুরু হবে এবং সেখান থেকে অন্যান্য কনফিগারেশন ফাইলের উত্স থেকে উত্সাহিত হবে। ব্যবহারকারীর / বাড়ির সেটআপ চূড়ান্ত করতে সাধারণত শেল আরসি এবং / অথবা প্রোফাইল দিয়ে শেষ হয়

আমি আমার .bash_ প্রোফাইলে ফাইলটি উত্সাহিত করেছি এবং এটি কার্যকর হয় না। আরসি এবং প্রোফাইল ফাইলগুলি কীভাবে কাজ করে সে সম্পর্কে আমি ইতিমধ্যে পরিচিত, তবে ব্যাখ্যাটির জন্য আপনাকে ধন্যবাদ।
জোসেফ গ্লোভার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.