আমি বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করতে একটি স্ক্রিপ্ট চালাতে চাই:
#!/bin/bash
cd web/www/project
তবে, আমি এটি চালানোর পরে, বর্তমান pwd অপরিবর্তিত রয়েছে! আমি এটা কিভাবে করবো?
আমি বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করতে একটি স্ক্রিপ্ট চালাতে চাই:
#!/bin/bash
cd web/www/project
তবে, আমি এটি চালানোর পরে, বর্তমান pwd অপরিবর্তিত রয়েছে! আমি এটা কিভাবে করবো?
উত্তর:
এটি একটি প্রত্যাশিত আচরণ এবং ইতিমধ্যে বেশ কয়েকবার আলোচনা হয়েছে।
স্ক্রিপ্টটি একটি সাব-শেলে চালিত হয়েছে এবং প্যারেন্ট শেল ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করতে পারে না। এটি শেষ হয়ে গেলে এর প্রভাবগুলি হারিয়ে যায়।
স্থায়ীভাবে ডিরেক্টরি পরিবর্তন করতে আপনার স্ক্রিপ্টটি উত্স হিসাবে দেওয়া উচিত
. ./script
source ./script
একই?
.
এবং source
বাশ সমান। ২. ./
ফাইলের নাম একই ডিরেক্টরিতে থাকলে এটি ব্যবহার করার আগে আমাদের দরকার নেই । এটি কেবল এটি চালানো ঠিক আছে:. script
এর মতো ছোট ছোট কাজের জন্য, স্ক্রিপ্ট তৈরি করার পরিবর্তে, এর মতো একটি উপকরণ তৈরি করুন,
$ alias cdproj='cd /dir/web/www/proj'
আপনি .bashrc
যদি এটি প্রতিটি ইন্টারেক্টিভ শেলের জন্য সেট করতে চান তবে আপনার ফাইলটিতে এটি যুক্ত করা উচিত ।
এখন আপনি এটি হিসাবে চালাতে পারেন $ cdproj
।
eval `./script`
বা সম্পাদন করতে পারে eval $(./script)
। কমান্ডগুলির জন্য এটি একটি সাধারণ পদ্ধতি যা আমন্ত্রণকারী শেলের পরিবেশ আপডেট করতে হবে need
eval
পদ্ধতির দিকে যেতে যাচ্ছেন তবে আপনি কী আউটপুট নিয়ে যান তা সম্পর্কে খুব যত্নশীল হন ।
exec bash
শেষে ব্যবহার করুনএকটি বাশ স্ক্রিপ্ট তার বর্তমান পরিবেশ বা তার শিশুদের উপর পরিচালিত হয়, তবে কখনও তার পিতামহুল পরিবেশের উপর নয়।
তবে, এই প্রশ্নটি প্রায়শই জিজ্ঞাসা করা হয় কারণ একজন অন্য ডিরেক্টরি থেকে ব্যাশ স্ক্রিপ্ট কার্যকর করার পরে একটি নির্দিষ্ট ডিরেক্টরিতে ব্যাশ প্রম্পটে ছেড়ে যেতে চায় ।
যদি এটি হয় তবে স্ক্রিপ্টের শেষে কেবল চাইল্ড ব্যাশের উদাহরণটি প্রয়োগ করুন:
#!/usr/bin/env bash
cd desired/directory
exec bash
এটি একটি নতুন সাবসেল তৈরি করে। exit
স্ক্রিপ্ট শুরুতে যেখানে প্রথম শেলটিতে ফিরে যেতে টাইপ করুন ।
exec
exit
(বা Ctrl + D) টাইপ করে পরিষ্কারভাবে সেশনটি শেষ করার চেষ্টা করেন , আপনাকে 11 থেকে 21 বার এটি করতে হবে। (২) এক্সিকিউটেবল স্ক্রিপ্ট ব্যবহারের আর একটি অপূর্ণতা হ'ল যদি আপনি আপনার ইন্টারেক্টিভ শেল সেশনে কোনও শেল বিকল্প (যেমন, dotglob
বা globstar
) সেট করেন তবে আপনি সেগুলি হারাবেন, কারণ আপনি একটি নতুন শেল শুরু করছেন।
উত্তরগুলি রয়েছে যা আপনি চান সঠিক ক্রিয়াটি করেন, এই জাতীয় উদ্দেশ্যে একটি আরও মানক পদ্ধতি হ'ল প্রতীকী লিঙ্ক তৈরি করা:
ln -s ~/web/www/project proj #use full path to dir!
তারপরে আপনি cd
নামটি ব্যবহার করে ডিরেক্টরিতে যেতে পারেন proj
:
cd proj
এই পদ্ধতিটি আরও নমনীয় কারণ আপনি ছাড়াই সংক্ষিপ্ত নাম ব্যবহার করে ফাইলগুলি অ্যাক্সেস করতে পারেন cd
:
ls proj/ #note the endslash!
vim proj/file.x
আপনি যদি ফাইল সিস্টেমে খুব দূরে ডিরেক্টরিগুলির মধ্যে পরিবর্তন করেন। আমি অটোজাম্পের পরামর্শ দেব ।
আপনি যা করতে যাচ্ছেন তার উপর নির্ভর করে, অন্য সমাধানটি কোনও স্ক্রিপ্টের পরিবর্তে একটি ফাংশন তৈরি করতে পারে।
উদাহরণ:
একটি ফাইলে একটি ফাংশন তৈরি করুন, আসুন বলি /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
তারপরে এটি আপনার bashrc
বা zshrc
ফাইলে অন্তর্ভুক্ত করুন:
# Somewhere in rc file
source /home/aidin/my-cd-script
এখন আপনি এটি কমান্ডের মতো ব্যবহার করতে পারেন:
$ my-cd
"এক্সিকিউট" ব্যবহার করবেন না কেন এটি আমার ইচ্ছে মতো ঠিকভাবেই করতে পারে।
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(বা Ctrl + D) টাইপ করে পরিষ্কারভাবে সেশনটি শেষ করার চেষ্টা করেন , আপনাকে 11 থেকে 21 বার এটি করতে হবে।
dotglob
বা globstar
) সেট করেন তবে আপনি সেগুলি হারাবেন, কারণ আপনি একটি নতুন শেল শুরু করছেন। ... (Cont'd)
আপনি এটি একটি ফাংশন ব্যবহার করে বা && ব্যবহার করে করতে পারেন উদাহরণগুলি নমুনা জাবিবিক্স ইনস্টল করে এবং এর ভিতরে একটি লাইন দিয়ে একটি ফাইল তৈরি করে।
উদা:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
বা:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
স্ক্রিপ্ট থেকে পালানোর জন্য ব্যবহার করা উচিত , নাexit
- এগুলি শেল ফাংশনগুলির মতো এবংexit
স্ক্রিপ্টটি উত্সাহিত শেল থেকে বেরিয়ে আসবে।