কীভাবে সঠিকভাবে PATH এ পাথ যুক্ত করবেন?


921

আমি ভাবছি যেখানে PATHপরিবেশের পরিবর্তনশীলটিতে একটি নতুন পথ যুক্ত করতে হবে । আমি জানি এটি সম্পাদনা .bashrc(উদাহরণস্বরূপ) দ্বারা সম্পন্ন করা যেতে পারে তবে এটি কীভাবে করবেন তা পরিষ্কার নয়।

এই পথে:

export PATH=~/opt/bin:$PATH

অথবা এটা?

export PATH=$PATH:~/opt/bin

printf '\ nPATH = $ PATH: "পাথ টু অ্যাড" \ নেক্সপোর্ট প্যাথ \ n' >> ~ / .bashrc
সুডোয়ার


যদি ইতিমধ্যে কিছু পাথ যুক্ত হয়, উদাহরণস্বরূপ PATH=$PATH:$HOME/.local/bin:$HOME/bin, এর সাথে আলাদা করে অন্য একটি যুক্ত করা যেতে পারে: উদাহরণস্বরূপ PATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/ec2-user/pear/bin
সন্দীপন নাথ

2
এই উত্তরগুলি কি লিনাক্সের সমস্ত স্বাদে কাজ করে?
Ungeheuer

উত্তর:


1031

সাধারণ জিনিস

PATH=$PATH:~/opt/bin

অথবা

PATH=~/opt/bin:$PATH

আপনি ~/opt/binশেষে যুক্ত করতে চান কিনা তার উপর নির্ভর করে (একাধিক ডিরেক্টরিতে একই নামে কোনও প্রোগ্রাম রয়েছে এমন ক্ষেত্রে অন্যান্য সমস্ত ডিরেক্টরি সন্ধানের জন্য) বা শুরুতে (অন্য সমস্ত ডিরেক্টরিগুলির আগে অনুসন্ধান করা হবে)।

আপনি একই সাথে একাধিক এন্ট্রি যুক্ত করতে পারেন। PATH=$PATH:~/opt/bin:~/opt/node/binবা অর্ডারিংয়ের কাজটির প্রকরণটি ঠিক আছে। exportলাইনের শুরুতে রাখবেন না কারণ এতে অতিরিক্ত জটিলতা রয়েছে (নীচে "বাশ ব্যতীত শেলের উপর নোটগুলি দেখুন") এর নীচে দেখুন।

যদি আপনার PATHঅনেকগুলি আলাদা উপাদান তৈরি হয়ে যায় তবে আপনি নকল এন্ট্রি দিয়ে শেষ করতে পারেন। দেখুন কিভাবে জুড়বেন home ডিরেক্টরিতে পাথ ইউনিক্স যা হুকুমে আবিষ্কৃত হবে? এবং সদৃশ কমান্ডের সাথে সদৃশ $ PATH এন্ট্রিগুলি সরিয়ে ফেলুন ডুপ্লিকেটগুলি এড়াতে বা এগুলি সরাতে।

কিছু বিতরণ স্বয়ংক্রিয়ভাবে ~/binএটি আপনার রাস্তায় রাখে যদি উপায় হয়।

কোথায় রাখব

পরিবর্তন করার লাইন রাখুন PATHমধ্যে ~/.profile, অথবা ~/.bash_profileযদি আপনি তা আছে।

নোট যে ~/.bash_rcকোনও প্রোগ্রাম দ্বারা না পঠিত, এবং ~/.bashrcএটি ব্যাশের ইন্টারেক্টিভ উদাহরণগুলির কনফিগারেশন ফাইল। আপনার মধ্যে পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত করা উচিত নয় ~/.bashrc। পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত করার জন্য সঠিক জায়গা PATHযেমন ~/.profile(বা ~/.bash_profileআপনি যদি বাশ ছাড়া অন্য শাঁসের বিষয়ে চিন্তা করেন না)। দেখুন তাদের মধ্যে পার্থক্য কী এবং আমার কোনটি ব্যবহার করা উচিত?

এটা করা না /etc/environmentবা ~/.pam_environment: এই ফাইলগুলি শেল করা হয় না, আপনার মত বদল ব্যবহার করতে পারবেন না $PATHসেখানে। এই ফাইলগুলিতে আপনি কেবল একটি পরিবর্তনশীলকে ওভাররাইড করতে পারেন, এতে যোগ করতে পারেন না।

কিছু সিস্টেম স্ক্রিপ্টে সম্ভাব্য জটিলতা

আপনি প্রয়োজন হবে না exportযদি পরিবর্তনশীল ইতিমধ্যে পরিবেশ রয়েছে: ভেরিয়েবলের মান কোন পরিবর্তন environment.¹ প্রতিফলিত হয় PATHহয় প্রায় কাছাকাছি সবসময় পরিবেশে; সমস্ত ইউনিক্স সিস্টেম এটি খুব তাড়াতাড়ি সেট করে (সাধারণত খুব প্রথম প্রক্রিয়াতে, আসলে)।

লগইন করার সময়, আপনি PATHইতিমধ্যে পরিবেশে থাকা এবং ইতিমধ্যে কিছু সিস্টেম ডিরেক্টরি ধারণ করে থাকতে পারেন । যদি আপনি কোনও স্ক্রিপ্ট লিখে থাকেন যা কোনও ধরণের ভার্চুয়াল পরিবেশ স্থাপনের সময় শুরুর দিকে কার্যকর করা যেতে পারে PATHতবে আপনার PATHএটি খালি এবং রফতানি করা দরকার: যদি এখনও সেট না করে থাকে তবে কিছু PATH=$PATH:/some/directoryসেট PATHকরতে হবে :/some/directoryএবং খালি উপাদানটি শুরুতে অর্থ বর্তমান ডিরেক্টরি (যেমন .:/some/directory)।

if [ -z "${PATH-}" ]; then export PATH=/usr/local/bin:/usr/bin:/bin; fi

বাশ ছাড়া অন্য শেলের উপর নোট

বাশ, ksh এবং zsh এ, exportএকটি বিশেষ বাক্য গঠন এবং উভয়ই PATH=~/opt/bin:$PATHএবং export PATH=~/opt/bin:$PATHসঠিক জিনিসটি এমনকি করুন। অন্যান্য বোর্নে / পসিক্স-স্টাইলের শেল যেমন ড্যাশ (যা /bin/shঅনেক সিস্টেমে রয়েছে), exportএকটি সাধারণ কমান্ড হিসাবে বিশ্লেষণ করা হয়, যা দুটি পার্থক্য বোঝায়:

সুতরাং ড্যাশের মতো শেলগুলিতে আক্ষরিক স্ট্রিংয়ে export PATH=~/opt/bin:$PATHসেট PATHহয় যার ~/opt/bin/:পরে PATHপ্রথম স্থানের মান থাকে । PATH=~/opt/bin:$PATH(একটি খালি অ্যাসাইনমেন্ট) এর জন্য কোট লাগবে না এবং সঠিক কাজটি করে। আপনি যদি exportকোনও পোর্টেবল স্ক্রিপ্টে ব্যবহার করতে চান তবে আপনাকে লিখতে হবে export PATH="$HOME/opt/bin:$PATH", বা PATH=~/opt/bin:$PATH; export PATH(বা PATH=$HOME/opt/bin:$PATH; export PATHপোর্টাবিলিটির জন্য এমনকি বোর্ন শেলটিও গ্রহণ করা export var=valueহয়নি যা টিল্ড সম্প্রসারণ গ্রহণ করে নি এবং গ্রহণ করে নি)।

B বোর্ন শেলসে এটি সত্য ছিল না (যেমন বাস্তব বোর্ন শেল যেমন আধুনিক পসিক্স-স্টাইল শাঁস নয়) তবে আপনি আজকাল যেমন পুরানো শাঁসের মুখোমুখি হওয়ার খুব সম্ভাবনা রাখেন না।


রফতানিতে জটিলতা এখনও বুঝতে পারছি না। আপনি কি এটি সহজ করতে পারেন?
প্রিওজিৎ প্রিয়ম

@ প্রিওজিৎপ্রিয়ম সরল ব্যাখ্যা: আপনার দরকার নেই export
গিলস

এই উত্তরের জন্য আপনাকে ধন্যবাদ, পুরোপুরি বিশদ। আপনি বলছেন " আপনার পরিবেশ ভেরিয়েবলগুলি ~ / .bashrc- এ সংজ্ঞায়িত করা উচিত নয় ", তবে দুর্ভাগ্যক্রমে আমি আমার সিস্টেমে যে সমস্ত প্রোগ্রাম ইনস্টল করেছি সেগুলির 100% যা পাথ (এফজেডএফ এবং জং এর কার্গো) এ পরিবর্তন করে তাতে পথটি পরিবর্তন করে .bashrc। আমি ধরে নিচ্ছি কারণ এফজেডএফটি মরিচায় লেখা হয়েছে এটি মরিচা ধরণের অনুসরণ করে।
icc97

83

যে কোনও উপায়ে কাজ করে তবে তারা একই কাজ করে না: উপাদানগুলি PATHবাম থেকে ডানে চেক করা হয়। আপনার প্রথম উদাহরণে, এক্সিকিউটেবলের ~/opt/binইনস্টল করাগুলির চেয়ে প্রাধান্য থাকবে, উদাহরণস্বরূপ, ইন /usr/bin, যা আপনি চান তা হতে পারে বা নাও পারে।

বিশেষত, সুরক্ষার দৃষ্টিকোণ থেকে, সামনের দিকে পাথ যুক্ত করা বিপজ্জনক, কারণ যদি কেউ আপনার লিখিত অ্যাক্সেস অর্জন করতে পারে তবে ~/opt/binউদাহরণস্বরূপ, lsসেখানে আলাদা কিছু রাখতে পারেন, যা আপনি সম্ভবত তার পরিবর্তে ব্যবহার করতে চান বিবেচনা /bin/lsনা করে। এখন sshবা আপনার ব্রাউজার বা পছন্দের জন্য একইটি কল্পনা করুন ... (আপনার পথে রাখার জন্য একইভাবে তিনবার যায়))


6
তবে আপনি যদি নিজের নিজস্ব, কাস্টমাইজড সংস্করণ রাখতে চান তবে আপনাকে lsএটি আগে ডিরেক্টরিতে রাখতে হবে /bin
বারমার

16
বা ওরফে ls = মাইলস
ওয়ালটিনেটর

36

আমি প্রশ্ন 2 দ্বারা বিভ্রান্ত হয়েছি (যেহেতু এটি কোনও সম্পর্কযুক্ত সমস্যার কারণে প্রশ্ন থেকে সরানো হয়েছে):

বিভিন্ন লাইনে আরও পাথ যুক্ত করার একটি কার্যকর উপায় কী? প্রাথমিকভাবে আমি ভেবেছিলাম এটি কৌশলটি করতে পারে:

export PATH=$PATH:~/opt/bin
export PATH=$PATH:~/opt/node/bin

তবে এটি নয় কারণ দ্বিতীয় অ্যাসাইনমেন্টটি কেবল যুক্ত হয় না ~/opt/node/bin, তবে পুরো PATHপূর্ব নির্ধারিতটিও whole

এটি একটি সম্ভাব্য কাজ:

export PATH=$PATH:~/opt/bin:~/opt/node/bin

তবে পাঠযোগ্যতার জন্য আমি এক পথের জন্য একটি অ্যাসাইনমেন্ট পছন্দ করতে চাই।

যদি তুমি বল

PATH=~/opt/bin

যে সব আপনার পাথ মধ্যে হতে হবে। PATH কেবল একটি পরিবেশের পরিবর্তনশীল, এবং আপনি PATH- এ যুক্ত করতে চাইলে আপনার পছন্দসই বিষয়বস্তু দিয়ে আপনাকে পরিবর্তনশীলটি পুনরায় তৈরি করতে হবে। এটি, আপনি প্রশ্ন 2 এর উদাহরণ হিসাবে যা দেন তা হ'ল আপনি যা করতে চান তা যদি না আমি পুরোপুরি প্রশ্নের বিন্দুটি মিস করি না।

আমি আমার কোডে উভয় ফর্ম ব্যবহার করি। আমার একটি জেনেরিক প্রোফাইল রয়েছে যা আমি যে সমস্ত মেশিনে কাজ করি তার উপর ইনস্টল করে রাখি, সম্ভাব্যরূপে অনুপস্থিত ডিরেক্টরিগুলির জন্য উপযুক্ত হতে:

export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11
# add optional items to the path
for bindir in $HOME/local/bin $HOME/bin; do
    if [ -d $bindir ]; then
        PATH=$PATH:${bindir}
    fi
done

2
প্রশ্ন 2 এর উদাহরণ সম্পর্কে আপনি ঠিক বলেছেন, এটি কার্যকর হয়। আমার সিস্টেমে PATH সম্পর্কিত আরও একটি সমস্যা আমাকে বিভ্রান্ত করেছে। তার জন্য দুঃখিত।
পাওলো

26

সংযোজন / প্রস্তুতির বুলেট-প্রুফ উপায়

অ্যাডেন্ডিং বনাম প্রিপেন্ডিংয়ের পছন্দ নিয়ে অনেক বিবেচনা জড়িত। তাদের মধ্যে অনেকগুলি অন্য উত্তরে areাকা রয়েছে, সুতরাং আমি তাদের এখানে পুনরুক্ত করব না।

একটি গুরুত্বপূর্ণ বিষয় হ'ল, এমনকি যদি সিস্টেম স্ক্রিপ্টগুলি এটি ব্যবহার না করে (আমি অবাক হয়েছি কেন) * 1 , $HOME/binPATH পরিবেশের পরিবর্তনশীলটিতে একটি পাথ (উদাহরণস্বরূপ ) যুক্ত করার বুলেট-প্রমাণ উপায় is

PATH="${PATH:+${PATH}:}$HOME/bin"

সংযোজন (পরিবর্তে PATH="$PATH:$HOME/bin") এবং এর জন্য

PATH="$HOME/bin${PATH:+:${PATH}}"

প্রিপেন্ডিংয়ের জন্য (পরিবর্তে PATH="$HOME/bin:$PATH")

$PATHপ্রাথমিকভাবে শূন্য থাকা অবস্থায় এটি স্প্রিয়াস লিডিং / ট্রেইলিং কোলন এড়িয়ে চলে , যার অনাকাঙ্খিত পার্শ্ব প্রতিক্রিয়া থাকতে পারে এবং এটি একটি দুঃস্বপ্ন হতে পারে , এটি খুঁজে পেতে অধরা হয়ে উঠতে পারে ( এই উত্তরটি সংক্ষেপে awkকেসটিকে মোকাবেলা করে)।

ব্যাখ্যা ( শেল প্যারামিটার সম্প্রসারণ থেকে ):

${parameter:+word}

যদি parameterনাল বা আনসেট করা থাকে তবে কিছুই প্রতিস্থাপন করা হয় না, অন্যথায় এর প্রসারকে wordবিকল্পযুক্ত করা হয়।

সুতরাং, ${PATH:+${PATH}:}, 1) কিছুই যদি: প্রসারিত হয় PATHফাঁকা বা সেট না, 2) হল ${PATH}:, যদি PATHসেট করা হয়।

দ্রষ্টব্য : এটি ব্যাশের জন্য।


* 1 আমি সবেমাত্র পেয়েছি যে স্ক্রিপ্টগুলি devtoolset-6/enableআসলে এটি ব্যবহার করে,

$ cat /opt/rh/devtoolset-6/enable
# General environment variables
export PATH=/opt/rh/devtoolset-6/root/usr/bin${PATH:+:${PATH}}
...

24

লিনাক্স $PATHপরিবেশের ভেরিয়েবলের সাথে এক্সিকিউটেবল অনুসন্ধানের পথ নির্ধারণ করে । $PATHএনভায়রনমেন্ট ভেরিয়েবলের শুরুতে ডিরেক্টরি / ডেটা / মাইক্রিপ্টগুলি যুক্ত করতে নিম্নলিখিত ব্যবহার করুন:

PATH=/data/myscripts:$PATH

সেই ডিরেক্টরিটিকে পথের শেষে যুক্ত করতে, নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

PATH=$PATH:/data/myscripts

তবে পূর্ববর্তীটি পর্যাপ্ত নয় কারণ আপনি যখন কোনও স্ক্রিপ্টের মধ্যে পরিবেশের পরিবর্তনশীল সেট করেন, তখন পরিবর্তনটি কেবল স্ক্রিপ্টের মধ্যে কার্যকর হয়। এই সীমাবদ্ধতার চারদিকে দুটি উপায় রয়েছে:

  • যদি স্ক্রিপ্টের মধ্যে থাকে তবে আপনি পরিবেশের পরিবর্তনশীল রফতানি করুন এটি স্ক্রিপ্ট দ্বারা ডাকা কোনও প্রোগ্রামের মধ্যে কার্যকর। নোট করুন যে স্ক্রিপ্ট বলা প্রোগ্রামের মধ্যে এটি কার্যকর নয়।
  • স্ক্রিপ্টকে কল করে এমন প্রোগ্রাম যদি কল করার পরিবর্তে অন্তর্ভুক্তি দ্বারা তা করে, স্ক্রিপ্টের যে কোনও পরিবেশগত পরিবর্তন কলিং প্রোগ্রামের মধ্যে কার্যকর। এই জাতীয় অন্তর্ভুক্তি ডট কমান্ড বা উত্স কমান্ড দিয়ে করা যেতে পারে।

উদাহরণ:

$HOME/myscript.sh
source $HOME/myscript.sh

অন্তর্ভুক্তি মূলত "ডাকা" স্ক্রিপ্টটিতে "ডাকা" স্ক্রিপ্ট অন্তর্ভুক্ত করে। এটি সি তে # অন্তর্ভুক্ত করার মতো তাই এটি "কলিং" স্ক্রিপ্ট বা প্রোগ্রামের মধ্যে কার্যকর। তবে অবশ্যই, কলিং প্রোগ্রাম দ্বারা ডাকা কোনও প্রোগ্রাম বা স্ক্রিপ্টগুলিতে এটি কার্যকর নয়। কল চেইন থেকে সমস্ত উপায়ে এটি কার্যকর করতে, আপনাকে অবশ্যই এক্সপোর্ট কমান্ডের সাহায্যে পরিবেশের পরিবর্তনশীলের সেটিংটি অনুসরণ করতে হবে।

উদাহরণ হিসাবে, ব্যাশ শেল প্রোগ্রাম অন্তর্ভুক্তির মাধ্যমে ফাইল .bash_profile এর বিষয়বস্তু অন্তর্ভুক্ত করে। .বাশ_প্রফাইলে নিম্নলিখিত 2 টি লাইন রাখুন:

PATH=$PATH:/data/myscripts
export PATH

বাশ প্রোগ্রামে কার্যকরভাবে সেই 2 লাইন কোডটি রাখে। সুতরাং ব্যাশের মধ্যে, $ PATH ভেরিয়েবল অন্তর্ভুক্ত রয়েছে $HOME/myscript.shএবং রফতানি বিবরণের কারণে ব্যাশ দ্বারা ডাকা কোনও প্রোগ্রামের পরিবর্তিত $PATHপরিবর্তনশীল থাকে। এবং যেহেতু আপনি কোনও ব্যাশ প্রম্পট থেকে চালিত কোনও প্রোগ্রামকে ব্যাশ বলা হয়, আপনি বাশ প্রম্পট থেকে চালানো যে কোনও কিছুর জন্য নতুন পথটি কার্যকর।

নীচের লাইনটি হ'ল পথে নতুন ডিরেক্টরি যুক্ত করতে হলে আপনাকে অবশ্যই শেলটিতে অন্তর্ভুক্ত একটি স্ক্রিপ্টের মধ্যে $ PATH এনভায়রনমেন্ট ভেরিয়েবলের ডিরেক্টরিটি সংযোজন বা প্রেন্ডিং করতে হবে এবং আপনাকে অবশ্যই $PATHপরিবেশের পরিবর্তনশীল রফতানি করতে হবে ।

আরও তথ্য এখানে


19

কিছু সময়ের জন্য আমি আমার সাথে দুটি ফাংশন রেখেছি pathaddএবং pathrmযা সদৃশ সম্পর্কে চিন্তা করার প্রয়োজন ছাড়াই পথে উপাদানগুলিকে যুক্ত করতে সহায়তা করে।

pathaddএকটি একক পাথ আর্গুমেন্ট এবং একটি afterargument PATHচ্ছিক যুক্তি গ্রহণ করে যা সরবরাহ করা হয় তা যদি অন্যথায় এটি সংযোজন করে it

প্রায় প্রতিটি পরিস্থিতিতে যদি আপনি সেই পথটিতে যুক্ত হন তবে আপনি সম্ভবত ইতিমধ্যে পথে থাকা যে কোনও কিছুকে ওভাররাইড করতে চাইছেন, যার কারণেই আমি ডিফল্টরূপে प्रीপেন্ড করতে পছন্দ করি।

pathadd() {
    newelement=${1%/}
    if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then
        if [ "$2" = "after" ] ; then
            PATH="$PATH:$newelement"
        else
            PATH="$newelement:$PATH"
        fi
    fi
}

pathrm() {
    PATH="$(echo $PATH | sed -e "s;\(^\|:\)${1%/}\(:\|\$\);\1\2;g" -e 's;^:\|:$;;g' -e 's;::;:;g')"
}

এটিকে আপনার পাঠ্য পরিবেশের পরিবর্তন করতে ইচ্ছুক যে কোনও স্ক্রিপ্টে রাখুন এবং আপনি এখন তা করতে পারেন।

pathadd "/foo/bar"
pathadd "/baz/bat" after
export PATH

আপনি যদি নিশ্চিত হয়ে থাকেন যে যদি ইতিমধ্যে সেখানে থাকে তবে এই পথে যোগ না করা। আপনি যদি এখন নিশ্চিত করতে চান তবে /baz/batএটি শুরু।

pathrm "/baz/bat"
pathadd "/baz/bat"
export PATH

এখন যে কোনও পথ যদি ইতিমধ্যে দ্বিগুণ না করে পথে থাকে তবে সামনে সরিয়ে নেওয়া যেতে পারে।


আপনার PATH- এ কোনও ডিরেক্টরি উপস্থিতির জন্য অনুসন্ধানের জন্য সম্পর্কিত এবং ক্লিনার পদ্ধতির: unix.stackexchange.com/a/32054/135943
ওয়াইল্ডকার্ড

9

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


6

কিছু পরিস্থিতি রয়েছে যেখানে এটি ব্যবহার করে এটিতে PATH=/a/b:$PATHকোনও পথ যুক্ত করার জন্য "ভুল" উপায় হিসাবে বিবেচনা করা যেতে পারে PATH:

  1. এমন একটি পথ যুক্ত করা যা আসলে কোনও ডিরেক্টরি নয়।
  2. ইতিমধ্যে PATHএকই ফর্মটিতে থাকা একটি পথ যুক্ত করা ।
  3. আপেক্ষিক পাথ যুক্ত করা (যেহেতু অনুসন্ধান করা প্রকৃত ডিরেক্টরিটি আপনি বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করার সাথে সাথে পরিবর্তিত হবে)।
  4. ইতিমধ্যে PATHভিন্ন রূপে থাকা একটি পাথ যুক্ত করা (যেমন, সিমলিঙ্কগুলি ব্যবহারের কারণে বা একটি উপনাম ..)।
  5. আপনি যদি 4 PATHটি করা এড়ান, অন্য প্রবেশদ্বিগুলিকে ওভাররাইড করার উদ্দেশ্যে যখন পথটি সামনে না সরানো হয় PATH

এই (কেবলমাত্র কেবলমাত্র) ফাংশন উপরের পরিস্থিতিতে "সঠিক জিনিস" করে (ব্যতীত নীচে দেখুন), ত্রুটি কোডগুলি দেয় এবং মানুষের জন্য সুন্দর বার্তা মুদ্রণ করে। ত্রুটি কোডগুলি এবং বার্তাগুলি যখন না চাওয়া হয় তা অক্ষম করা যায়।

prepath() {
    local usage="\
Usage: prepath [-f] [-n] [-q] DIR
  -f Force dir to front of path even if already in path
  -n Nonexistent dirs do not return error status
  -q Quiet mode"

    local tofront=false errcode=1 qecho=echo
    while true; do case "$1" in
        -f)     tofront=true;       shift;;
        -n)     errcode=0;          shift;;
        -q)     qecho=':';          shift;;
        *)      break;;
    esac; done
    # Bad params always produce message and error code
    [[ -z $1 ]] && { echo 1>&2 "$usage"; return 1; }

    [[ -d $1 ]] || { $qecho 1>&2 "$1 is not a directory."; return $errcode; }
    dir="$(command cd "$1"; pwd -P)"
    if [[ :$PATH: =~ :$dir: ]]; then
        $tofront || { $qecho 1>&2 "$dir already in path."; return 0; }
        PATH="${PATH#$dir:}"        # remove if at start
        PATH="${PATH%:$dir}"        # remove if at end
        PATH="${PATH//:$dir:/:}"    # remove if in middle
    fi
    PATH="$dir:$PATH"
}

ব্যতিক্রমটি হ'ল এই ফাংশনটি PATHঅন্য উপায়ে যুক্ত পথগুলিকে আড়ম্বরপূর্ণ করে না , সুতরাং যদি কোনও পাথের জন্য কোনও অ-ক্যানোনিকাল এলিফ থাকে PATHতবে এটি একটি সদৃশ যোগ করবে। ইতিমধ্যে PATHপ্রবেশকারী পাথগুলিকে আকাঙ্ক্ষিত করার চেষ্টা করা একটি দ্বৈত প্রস্তাব যা কোনও আপেক্ষিক পাথের সুস্পষ্ট অর্থ থাকে যখন পাশ করা হয় prepathতবে ইতিমধ্যে যখন আপনি জানেন না যে বর্তমান ওয়ার্কিং ডিরেক্টরিটি যুক্ত হয়েছিল তখন এটি কী ছিল।


আপেক্ষিক পাথ সম্পর্কিত: '-r' স্যুইচ হওয়ার বিষয়ে কী, যা প্রথমে পরম না করে পাথ যুক্ত করবে এবং এটি যুক্ত করার আগে এটি পরম হিসাবেও খুঁজে পাবে? এটি যদি স্ক্রিপ্ট হয় তবে অন্য এটিতে এটি ব্যবহার করতে পারে। এটি একটি ফাংশন হিসাবে থাকার কোন সুবিধা আছে? সুন্দর কোড!
হোইজুই

1
@ হাইজুই এটি একটি ফাংশন হতে হবে কারণ এটি বর্তমান পরিবেশটি পরিবর্তন করছে। যদি এটি কোনও স্ক্রিপ্ট হয়, তবে এটি স্ক্রিপ্টটি চালাচ্ছে সাব-প্রসেসের পরিবেশ পরিবর্তন করবে এবং যখন স্ক্রিপ্টটি বের হবে তখন আপনি আগের মতোই থাকবেন $PATH। হিসাবে -r, না, আমি মনে করি যে আপেক্ষিক পাথগুলি একটি সাধারণ সরঞ্জামে এরকম কিছু সমর্থন করতে চাইলে $PATHকেবল খুব অবিশ্বাস্য এবং অদ্ভুত (আপনার পথটি প্রতিবার পরিবর্তিত হয় আপনি cd!)।
কর্ট জে সাম্পসন

5

আমার জন্য (ম্যাক ওএস এক্স ১০.৯.৫ এ) /mypathnameফাইলটিতে পাথের নাম (যেমন ) যুক্ত করা /etc/pathsখুব ভাল কাজ করেছে worked

সম্পাদনার আগে, echo $PATHফেরত:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

/etc/pathsশেলটি সম্পাদনা ও পুনঃসূচনা করার পরে , $ PATH ভেরিয়েবলটি যুক্ত করা হয় /pathname। প্রকৃতপক্ষে, echo $PATHফেরত:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

যা ঘটেছিল তা ভেরিয়েবলের /mypathnameসাথে যুক্ত করা হয়েছে $PATH


3
/Etc/paths.d ডিরেক্টরিতে / etc / পাথ ফাইল নিজে সম্পাদনা করার চেয়ে ফাইল যুক্ত করা ভাল itself
rbrewer

4

PATHপরিবেশের পরিবর্তনশীলটিতে একটি নতুন পথ যুক্ত করতে :

export PATH=$PATH:/new-path/

জন্য এটি পরিবর্তন আপনি খুলতে প্রতি শেল প্রয়োগ করা, যে ফাইলটি শেল হবে এটি যোগ উৎস যখন এটি প্রার্থনা করা হয়। বিভিন্ন শেলের মধ্যে এটি হতে পারে:

  • বাশ শেল:। / .Bash_profile, ~ / .bashrc বা প্রোফাইল
  • কর্ন শেল: ~ / .kshrc বা। প্রোফাইল
  • জেড শেল:। / .Zshrc বা .zprofile

যেমন

# export PATH=$PATH:/root/learning/bin/
# source ~/.bashrc
# echo $PATH

আপনি উপরের আউটপুটে প্রদত্ত পাথটি দেখতে পাচ্ছেন।


4

এখানে আমার সমাধান:

PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: '!x[$0]++' | sed "s/\(.*\).\{1\}/\1/")

একটি দুর্দান্ত সহজ একটি লাইনার যা কোনও পিছনে ছাড়বে না :


1
-বাশ: অজক: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই -বাশ: সেড: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই
davidcondrey

1
@ ডেভিডকন্ড্রে - অ্যাডক এবং সিড খুব সাধারণ বাহ্যিক আদেশ রয়েছে। এই উত্তরটি একই অর্জনের খাঁটি-বাশ উপায় সরবরাহ করে, তাই যখন জোর করে এবং / অথবা
সেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.