শেল স্ক্রিপ্ট থেকে সাফল্যের সাথে .bashrc উত্স হতে পারে না


51

সাধারণত আমরা ~/.bashrcএই কমান্ডটি ব্যবহার করে ফাইল উত্স করতে পারি

source ~/.bashrc

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

আমার লিপি:

#!/bin/bash
chmod a+x ~/.bashrc
source ~/.bashrc

.পরিবর্তে চেষ্টা (বিন্দু) source। একই ফলাফল।

উত্তর:


26

একটি শেল স্ক্রিপ্ট তার নিজস্ব শেল ইনস্ট্যান্সে চালিত হয়। সমস্ত পরিবর্তনশীল সেটিংস, ফাংশন সংজ্ঞা এবং এগুলি কেবলমাত্র এই উদাহরণটিকে প্রভাবিত করে (এবং সম্ভবত এটির শিশুরা) তবে কলিং শেল নয় তাই স্ক্রিপ্ট শেষ হওয়ার পরে তারা চলে গেছে।

বিপরীতে sourceকমান্ডটি নতুন শেল ইনস্টান্স শুরু করে না তবে বর্তমান শেলটি ব্যবহার করে যাতে পরিবর্তনগুলি থেকে যায়।

আপনি যদি শর্টকাটটি পড়তে চান তবে আপনার .bashrc শেল স্ক্রিপ্টের পরিবর্তে শেল ফাংশন বা একটি উপন্যাস ব্যবহার করুন, পছন্দ করুন

alias brc='source ~/.bashrc'

আপনার দ্রুত উত্তর দেওয়ার জন্য ধন্যবাদ। আপনার সমাধানটি সম্ভবত কাজ করে তবে 'আলিয়াক বিআরসি = ....' লাইনটি সংরক্ষণ করতে আমাকে বাশার্ক ফাইলটি ম্যানুয়ালি সম্পাদনা করতে হবে। পরিবেশের পরিবর্তনশীল পরিবর্তন করতে আমি গুই বিকাশের চেষ্টা করছি। সুতরাং আমি অন্য কম্পিউটারের বাশার্ক ফাইলটি ম্যানুয়ালি সম্পাদনা করতে পারি না।
শান্তনু

1
আপনি source ~/.bashrcযে শেলটি দিয়ে পরিবেশ পরিবর্তন করতে চান তা চালাতে হবে । আপনি এটি অন্য প্রক্রিয়া থেকে পরিবর্তন করতে পারবেন না। হতে পারে (বিশ্বব্যাপী) এই উপনামটি যুক্ত করা আপনার জিইউআইয়ের ইনস্টল প্রক্রিয়াটির একটি অংশ হতে পারে।
ফ্লোরিয়ান ডিয়েচ

1
সুতরাং আমি কি আপনার উরফ কমান্ডটি স্ক্রিপ্টের মধ্যে আগে রেখেছি এবং তারপরে যখন আমি আমার .bashrc উত্স উত্স করতে চাই বা তখন আমার কোনও উরফ আদেশটি কোনও ফাইলের মধ্যে স্থাপন করা দরকার?
ব্যবহারকারী 137717

আমি যা করতে পেরেছি তা হ'ল ফ্লোরিয়ান ডিয়েশের উত্তরের একটি বর্ধন। আপনি কেবলমাত্র একটি বহু-লাইন উপনাম ব্যবহার করতে পারেন: ওরফে বিআরসি = 'chmod এ + x ~ / .bashrc; উত্স। / .brcrc 'আমি এখনও বেশ নতুন, তাই এটি' দুর্বল অনুশীলন 'হিসাবে বিবেচনা করা হয় কিনা তা আমি নিশ্চিত নই। এটি যদিও কাজ করে।
A_user_appears

13

আপনার .bashrcসাধারণত শুরু হয়:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

যেহেতু আপনার স্ক্রিপ্টে PS1 সেট নেই (কারণ এটি ইন্টারেক্টিভ নয়), এটি পথ পুনরায় সেট করে না কারণ এটি প্রস্থানটি প্রারম্ভিক হয়। প্রদর্শন করতে, আপনার স্ক্রিপ্টটি সংশোধন করুন:

    #!/bin/bash
    chmod a+x ~/.bashrc
    PS1='$ '
    source ~/.bashrc

এটি এখন আপনার স্ক্রিপ্টগুলি নতুনের সাথে কাজ করার অনুমতি দেবে .bashrc। দ্রষ্টব্য: আপনার স্ক্রিপ্টটি একবারে বের হয়ে গেলে, স্ক্রিপ্টটি শুরু করার আগে এনভির সাথে সেট করা হবে। পরের বার টার্মিনালটি শুরু হওয়ার পরে পরিবর্তনগুলি প্রতিফলিত হবে।


কমপক্ষে 16.04 এবং সম্ভবত এর আগে থেকে, ডিফল্ট উবুন্টু .bashrcশেলটি ইন্টারেক্টিভ কিনা তা পরীক্ষা করার জন্য আরও নির্ভরযোগ্য উপায় ব্যবহার করে। /etc/bash.bashrcএখনও PS1 পরীক্ষা আছে।
জান্না

12

চেষ্টা করুন:

exec bash

এটি ~ / .bashrc, ~ / .bash_aliases, ইত্যাদি পুনরায় লোড করা উচিত


9
এটি বর্তমান বাশ প্রক্রিয়াটিকে একটি নতুন দিয়ে প্রতিস্থাপন করে। এটি ব্যবহারের চেয়ে বেশি খাটো বা সহজ sourceনয় তবে ব্যবহারকারীর দ্বারা ম্যানুয়ালি সেট করা কোনও ভেরিয়েবল এবং এটি নষ্ট করে দেয় - যা আপনি চান তা বা নাও পারে।
ফ্লোরিয়ান ডিয়েচ

বাশার্কসোর্সিংয়ের পরে অন্যান্য কমান্ডের সাথে শেল স্ক্রিপ্টের প্রসঙ্গে, আপনি কি সেই কমান্ডগুলি রেখেছেন যেগুলির পরে নতুন বাশনের প্রয়োজন হবে exec bash, আমি যে কমান্ডটি পরে বুঝতে পারি তা এখনও আগের মতো একই বাশ সেটিংসে থাকবে?
টাটসু

11

আমি রাবির উত্তরটি পরিপূরক করতে চাই :

এই আচরণটি উবুন্টুর সাথে সুনির্দিষ্ট (এবং সম্ভবত সর্বাধিক উত্সযুক্ত ডিস্ট্রোস), যেহেতু আপনার ডিফল্ট ~/.bashrcফাইলটি একটি শর্ট-সার্কিট, উবুন্টু 18.04 দিয়ে শুরু হয়, উদাহরণস্বরূপ:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

এটি যদি কোনও অ-ইন্টারেক্টিভ শেলটিতে চালিত হয় তবে ফাইলটির মূল্যায়ন বন্ধ হবে, যা আপনার স্ক্রিপ্টের ক্ষেত্রে যেহেতু সমস্ত স্ক্রিপ্ট একটি অ ইন্টারেক্টিভ শেলটিতে চালিত হয় এবং পরবর্তীকালে প্রতিটি ফাইল আপনি sourceএই সম্পত্তিটির উত্তরাধিকারী হবেন।

eval টাট্টু ঘোড়া

উবুন্টুকে বিশেষ করে এর evalপরিবর্তে ব্যবহার করার জন্য আমি একটি কুৎসিত হ্যাক পেয়েছি source:

eval "$(cat ~/.bashrc | tail -n +10)"

এটি কেবল কয়েকটি প্রথম লাইন এড়িয়ে যায় এবং বাকিগুলির মূল্যায়ন করে ~/.bashrcযাতে বাকী মূল্যায়ন করা হয় এবং বর্তমান সম্পাদনকে সংশোধন করে।

সচেতন থাকুন এটি একটি যাদু নম্বর এবং উবুন্টু সংস্করণগুলিতে কাজ নাও করতে পারে; আপনি যদি আরও কম-বেশি পরিচিত সিস্টেমগুলির জন্য স্ক্রিপ্টগুলি ক্র্যাফট করছেন তবে এটি একটি ভাল সমাধান হতে পারে।

একটি ফ্যানসিয়ার সলিউশন মূল্যায়ন থামিয়ে দেয় এমন নির্দিষ্ট বিটগুলিকে টার্গেট করতে রেজেেক্স ব্যবহার করে জড়িত থাকতে পারে।

শেবাং বিকল্প

আরও কিছু বিকল্প যা কিছু পরিস্থিতিতে আরও ভাল কাজ করতে পারে তা হ'ল স্ক্রিপ্টটি শেবাংয়ের মধ্যে একটি পতাকা যুক্ত করে একটি ইন্টারেক্টিভ শেলটিতে চালিত করতে বাধ্য করা :

#!/bin/bash -i

কয়েকটি বিষয় সম্পর্কে সচেতন হন:

  • এটা একটা ভাল অনুশীলন ব্যবহার করতে #!/usr/bin/env bashফর্ম কিন্তু এই ভাবে আপনি আর্গুমেন্ট সহ শেল শুরু করতে পারে না
  • ব্যবহার -iপরিণতি এটা নিজস্ব সেট আছে, তাদের মধ্যে, প্রোগ্রাম যা ব্যবহারকারীর কোনো ভূমিকা জন্য প্রম্পট হবে এবং এই সাধারণত স্ক্রিপ্টের জন্য উদ্দেশ্যে না হয়, উদাহরণস্বরূপ, ইনস্টল করার debপ্যাকেজ এ স্ক্রিপ্ট বন্ধ করতে পারে dpkg configureঅনুরোধ জানানো
  • আমি প্রথমে ব্যবহার করার চেষ্টা set -iএবং set +iউপর এবং যেখানে আমি এটা প্রয়োজন বন্ধ বৈশিষ্ট্যটি চালু, কিন্তু এই কাজ করে না

2

অন্য কোনও পদ্ধতিই আমার জন্য কাজ করেছিল না [ source /path/to/fileবনাম . ./path/to/file, ওরফে, ইত্যাদি ...], যতক্ষণ না, এই টিউটোরিয়ালটির জন্য ধন্যবাদ আমি আবিষ্কার করেছি যে এটি ব্যবহার করে:

#!/usr/bin/env bash কুঁড়েঘর

সরলটির পরিবর্তে তর্ককারীকে #!/usr/bin/envঅনুবাদকের কাছে যেতে দেয়, যা আমি মনে করি এখানে মূল কী - আরও তথ্যের জন্য এই নথিটি দেখুন।

যে কোনও ইভেন্টে, যদি কোনও ফর্মের সোর্স কমান্ডগুলি আপনার জন্য কাজ না করে তবে আপনার শেবাং যাচাই করে দেখুন, সমস্যা হতে পারে :)

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