টিএল; ডিআর: আপনি সংজ্ঞায়িত ফাংশনটিsudo -i
চালাতে ব্যবহার করতে পারেন (তবে একটি নাম নেই) এবং সেই ফাইল থেকে রফতানি হওয়া ভেরিয়েবলের অ্যাক্সেসও রাখতে পারেন:/root/.bashrc
sudo -i কমান্ড আর্গুমেন্ট
উপনামগুলি সেখানে কাজ করে না, তবে আপনি যদি এগুলিকে উপলব্ধ করতে চান তবে আপনি সহজেই সেগুলিকে ফাংশনে রূপান্তর করতে পারেন sudo -i
।
সম্পূর্ণ বিশ্লেষণ এবং আরও বিশদ জন্য পড়ুন।
এখানে কয়েকটি সমস্যা রয়েছে, কিছু সুডো কীভাবে কাজ করে এবং কিছু বাশ নিজে কীভাবে কাজ করে ...
ডিফল্টরূপে, sudo
কেবল কমান্ড সন্ধান করবে এবং শেলকে বাইপাস করবে, সুতরাং কেবলমাত্র চলমান sudo ll
কাজ কেবল তখনই কাজ করবে যদি কোনও ll
ডিরেক্টরিতে কোনও এক্সিকিউটেবল থাকে $PATH
। সুতরাং, এলিয়াসগুলি (বা ফাংশন) ব্যবহার করার জন্য আপনাকে অবশ্যই নিশ্চিত করতে হবে যে প্রক্রিয়াটির অংশ হিসাবে শেলটি ব্যবহৃত হয়েছে।
ওয়ান ওয়ে ভালো কিছু চালানো হবে sudo sh
বা sudo bash
, যদিও আধুনিক sudo
(আমি উবুন্টু 1.8.19p1 উপর এই পরীক্ষার করছি) বিকল্প রয়েছে -s
এবং -i
যে উদ্দেশ্যে।
সুতরাং একটি চেষ্টা এর মতো কিছু হবে sudo -s ll
(যা সমান sudo bash -c 'll'
, আপনার $SHELL
বাশ হিসাবে ধরে নেওয়া , যা rcfile
আপনি উল্লিখিত ভিত্তিতে কেস বলে মনে হচ্ছে )) তবে এটি কোনওভাবেই কাজ করে না, যেহেতু এটি শাঁসটি একটি অ-ইন্টারেক্টিভ থেকে শুরু করে, অ-লগইন মোড, যা এর কোনও প্রারম্ভিক ফাইল পড়বে না। এটি মূলত একই রকম যদি আপনি কোনও শেল স্ক্রিপ্ট লেখেন এবং #!/bin/bash
এটি চালানোর জন্য ব্যবহার করেন। আপনার যে এলিয়াসগুলি (এবং ফাংশন) রয়েছে ~/.bashrc
সেগুলি স্ক্রিপ্ট থেকে অ্যাক্সেসযোগ্য হবে না ...
এরপরে -i
অপশনটি রয়েছে যা লগইন শেল তৈরি করে। এটিই বেশী প্রতিশ্রুতি আছে, যেহেতু এটি হবে আপনার আরম্ভের ফাইলগুলি পড়তে! এবং এখনও, sudo -i ll
(সমতুল্য sudo bash -l -c 'll'
) এখনও কাজ করবে না। সুতরাং এটি কীভাবে সম্ভব, প্রদত্ত এটির নামটির সংজ্ঞাটি পড়ে কিll
?
ঠিক আছে, এখানে পরবর্তী ব্যাখ্যাটি হ'ল, ডিফল্টরূপে, শ্যাশটি ইন্টারেক্টিভ ছাড়া কেবল ব্যাস আলিয়াসগুলি প্রসারিত করবে না ... sudo -i
(বা bash -l
) দ্বারা শুরু করা এই শেলটি একটি লগইন শেল, তবে এখনও ইন্টারেক্টিভ নয়।
সুতরাং পরবর্তী পদক্ষেপটি একটি ইন্টারেক্টিভ শেল পাওয়া, যা তারপরে কাজ করে :
sudo bash -i -c 'll'
( লগইন এবং ইন্টারেক্টিভ উভয়ই থাকা ভাল, অবশ্যই কার্যকর bash -l -i -c ...
হবে))
আরেকটি বিকল্প হ'ল লগইন শেল (অ-ইন্টারেক্টিভ) ব্যবহার করা চালিয়ে যাওয়া কিন্তু এটিকে এলিয়াসগুলি প্রসারিত করার জন্য স্পষ্টভাবে জিজ্ঞাসা করুন, সুতরাং এটি কাজ করবে:
sudo bash -l -O expand_aliases -c 'll'
(বাশ ইন্টারেক্টিভ ছিল এমন ক্ষেত্রে লগইন শেলের দরকার পড়েনি, যেহেতু প্রারম্ভিককরণ ফাইলগুলি পড়ার জন্য এটি যথেষ্ট, তবে এটি -l
তাদের পড়তে হবে))
এগুলি মোটামুটি দীর্ঘ কমান্ড লাইনগুলি ... এবং তাদের এছাড়াও আপনার পুরো শেল কমান্ডটি উদ্ধৃত করা দরকার, সুতরাং আপনি যদি কোনও যুক্তি দিয়ে কোনও উপাধি কল করেন, আপনাকে সমস্ত কিছু স্ট্রিংয়ে রূপান্তর করতে হবে ... সুতরাং এটি একধরণের ব্যবহার করতে আনাড়ি ...
নোট করুন যে আগে আমি এলিয়াস এবং ফাংশন সম্পর্কে কথা বলছিলাম ... এটি উদ্দেশ্য ছিল, যেহেতু এখানে ফাংশনগুলি আসলে অনেক বেশি সুবিধাজনক। শেলের উপর ফাংশন সম্পাদন করার জন্য আপনার ততক্ষণ কোনও বিশেষ (যেমন একটি ইন্টারেক্টিভ শেল থাকা বা একটি নির্দিষ্ট বিকল্প সেট করা) দরকার নেই যতক্ষণ আপনি তাদের সংজ্ঞাটি স্রোস করছেন।
সুতরাং আপনি যদি কোনও উপামের পরিবর্তে ll
কোনও ফাংশন হিসাবে সংজ্ঞায়িত হন তবে আপনি এটি সুডোর -i
শর্টকাটের সাহায্যে সরাসরি ব্যবহার করতে সক্ষম হবেন :
sudo -i ll
এবং যদি আপনার কাছে আর্গুমেন্টের সাথে দীর্ঘতর কমান্ড-লাইন থাকে তবে আপনি এগুলি সরাসরি এখানেও দিতে পারেন:
sudo -i ll -C -R /etc
(তুলনা করুন sudo bash -i -c 'll -C -R /etc'
।)
ক্রিয়াকলাপগুলি আরও অনেক নমনীয় এবং বজায় রাখা সাধারণত সহজ ... সাধারণত একটি উপনামকে একটি ফাংশনে রূপান্তর করা সহজ, একমাত্র সতর্কতা হ'ল সর্বদা ব্যবহার করা "$@"
যেখানে আপনি অতিরিক্ত যুক্তি গ্রহণের প্রত্যাশা করতেন (সাধারণত শেষের দিকে ওরফে।)
উদাহরণস্বরূপ, এই উপনাম:
alias ll='ls $LS_OPTIONS -l'
এই ফাংশনে পরিণত হতে পারে:
ll () {
ls $LS_OPTIONS -l "$@"
}
তারা, বেশিরভাগ উদ্দেশ্যে, সমতুল্য। এবং যেমনটি পূর্বে উল্লেখ করা হয়েছে, ফাংশনটি সরাসরি থেকে অ্যাক্সেসযোগ্য হওয়া উচিত sudo -i
, যাতে এটি একটি যুক্ত বোনাস।
আমি আশা করি আপনি এই উত্তর এবং ব্যাখ্যা সহায়ক বলে মনে করি!
/root/.bashrc
তবে সত্যিকার অর্থে Q এর পরে কী হয় এই ফাইলটির এলিয়াস - এটি প্রতি সম্ভব নয় - unix.stackexchange.com/questions/1496/… ।