বর্তমান ডিরেক্টরি পরিবর্তন করার জন্য স্ক্রিপ্ট (সিডি, পিডাব্লুডি)


44

আমি বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করতে একটি স্ক্রিপ্ট চালাতে চাই:

#!/bin/bash
cd web/www/project

তবে, আমি এটি চালানোর পরে, বর্তমান pwd অপরিবর্তিত রয়েছে! আমি এটা কিভাবে করবো?

উত্তর:


63

এটি একটি প্রত্যাশিত আচরণ এবং ইতিমধ্যে বেশ কয়েকবার আলোচনা হয়েছে।

স্ক্রিপ্টটি একটি সাব-শেলে চালিত হয়েছে এবং প্যারেন্ট শেল ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করতে পারে না। এটি শেষ হয়ে গেলে এর প্রভাবগুলি হারিয়ে যায়।

স্থায়ীভাবে ডিরেক্টরি পরিবর্তন করতে আপনার স্ক্রিপ্টটি উত্স হিসাবে দেওয়া উচিত

. ./script

8
@ সনি: দ্রষ্টব্য যে আপনার এইভাবে উত্সযুক্ত returnস্ক্রিপ্ট থেকে পালানোর জন্য ব্যবহার করা উচিত , না exit- এগুলি শেল ফাংশনগুলির মতো এবং exitস্ক্রিপ্টটি উত্সাহিত শেল থেকে বেরিয়ে আসবে।
চার্লস স্টুয়ার্ট

@ চার্লসস্টেয়ার্ট আসলে, আমি টানা স্ক্রিপ্টগুলির সাথে পরিচিত নই। ধন্যবাদ!
সনি সান্টোস

5
হয় source ./scriptএকই?
amyassin

2
@ এমায়াসিন: হ্যাঁ, এটি
এনজোটিব

2
1. .এবং sourceবাশ সমান। ২. ./ফাইলের নাম একই ডিরেক্টরিতে থাকলে এটি ব্যবহার করার আগে আমাদের দরকার নেই । এটি কেবল এটি চালানো ঠিক আছে:. script
sobi3ch

19

এর মতো ছোট ছোট কাজের জন্য, স্ক্রিপ্ট তৈরি করার পরিবর্তে, এর মতো একটি উপকরণ তৈরি করুন,

$ alias cdproj='cd /dir/web/www/proj'

আপনি .bashrcযদি এটি প্রতিটি ইন্টারেক্টিভ শেলের জন্য সেট করতে চান তবে আপনার ফাইলটিতে এটি যুক্ত করা উচিত ।

এখন আপনি এটি হিসাবে চালাতে পারেন $ cdproj


1
এছাড়াও স্ক্রিপ্টটি কার্যকর করতে হবে এমন কমান্ডগুলি প্রতিধ্বনি করতে পারে এবং তারপরে এই কমান্ডগুলি ব্যবহার করতে eval `./script` বা সম্পাদন করতে পারে eval $(./script)। কমান্ডগুলির জন্য এটি একটি সাধারণ পদ্ধতি যা আমন্ত্রণকারী শেলের পরিবেশ আপডেট করতে হবে need
কিথ থমসন

2
আপনি যদি evalপদ্ধতির দিকে যেতে যাচ্ছেন তবে আপনি কী আউটপুট নিয়ে যান তা সম্পর্কে খুব যত্নশীল হন ।
jw013

13

exec bashশেষে ব্যবহার করুন

একটি বাশ স্ক্রিপ্ট তার বর্তমান পরিবেশ বা তার শিশুদের উপর পরিচালিত হয়, তবে কখনও তার পিতামহুল পরিবেশের উপর নয়।

তবে, এই প্রশ্নটি প্রায়শই জিজ্ঞাসা করা হয় কারণ একজন অন্য ডিরেক্টরি থেকে ব্যাশ স্ক্রিপ্ট কার্যকর করার পরে একটি নির্দিষ্ট ডিরেক্টরিতে ব্যাশ প্রম্পটে ছেড়ে যেতে চায় ।

যদি এটি হয় তবে স্ক্রিপ্টের শেষে কেবল চাইল্ড ব্যাশের উদাহরণটি প্রয়োগ করুন:

#!/usr/bin/env bash
cd desired/directory
exec bash

এটি একটি নতুন সাবসেল তৈরি করে। exitস্ক্রিপ্ট শুরুতে যেখানে প্রথম শেলটিতে ফিরে যেতে টাইপ করুন ।


গৃহীত উত্তরের মতো স্ক্রিপ্টটি exec
উত্সাহিত করা আরও ভাল: ব্যবহারটি

1
এই কৌশলটি 9 টি প্রসারিত ডেবিয়ানে কাজ করে না।
ভেজেনেন

3
এটি এই সম্পর্কে যেতে ভুল উপায়!
ডেনিস উইলিয়ামসন

4
যেহেতু কেউ এর সাথে সমস্যাগুলির বিস্তারিত বিশদ দেয় না (@ ডেনিস আমি আপনার দিকে তাকিয়ে আছি): (1) আপনি যখনই এটি চালাবেন এটি একটি নতুন, অবিরাম বাশ প্রক্রিয়া তৈরি করে। এটি একটি অধিবেশনে দশ বা বিশ বার করুন এবং আপনার 11 থেকে 21 টি বাশ প্রসেস পাইল করা হবে। এটি পারফরম্যান্সকে প্রভাবিত করতে পারে এবং আপনি যদি exit(বা Ctrl + D) টাইপ করে পরিষ্কারভাবে সেশনটি শেষ করার চেষ্টা করেন , আপনাকে 11 থেকে 21 বার এটি করতে হবে। (২) এক্সিকিউটেবল স্ক্রিপ্ট ব্যবহারের আর একটি অপূর্ণতা হ'ল যদি আপনি আপনার ইন্টারেক্টিভ শেল সেশনে কোনও শেল বিকল্প (যেমন, dotglobবা  globstar) সেট করেন তবে আপনি  সেগুলি হারাবেন, কারণ আপনি একটি নতুন শেল শুরু করছেন।
জি-ম্যান 16.39

1
খুব সুন্দর সমাধান! আমি আমার ওরফে বাশ_প্রফাইলে নতুন করে লিখেছি তাই এখন এটি একটি পৃথক ফাইলে সংরক্ষণ করা স্ক্রিপ্ট। আমি সদ্য নির্মিত অস্থায়ী ফোল্ডারে যেতে স্ক্রিপ্টটি ব্যবহার করি। এবং এখন অস্থায়ী বাশ সেশন করা আরও সহজ। এসআরপি পদক্ষেপে! ধন্যবাদ!
artyom.razinov

8

উত্তরগুলি রয়েছে যা আপনি চান সঠিক ক্রিয়াটি করেন, এই জাতীয় উদ্দেশ্যে একটি আরও মানক পদ্ধতি হ'ল প্রতীকী লিঙ্ক তৈরি করা:

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


4

আপনি যা করতে যাচ্ছেন তার উপর নির্ভর করে, অন্য সমাধানটি কোনও স্ক্রিপ্টের পরিবর্তে একটি ফাংশন তৈরি করতে পারে।

উদাহরণ:

একটি ফাইলে একটি ফাংশন তৈরি করুন, আসুন বলি /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

0

"এক্সিকিউট" ব্যবহার করবেন না কেন এটি আমার ইচ্ছে মতো ঠিকভাবেই করতে পারে।

#!/bin/bash

cd someplace
exec bash

~/someplace

1
আপনি যা চান তা মনে হচ্ছে এমন বিষয় থেকে সাবধান থাকুন । (একটি বিশাল কাঠের ঘোড়া! আমি যা চাইছিলাম!) আপনি যখনই এটি চালান, এটি একটি নতুন, অবিরাম বাশ প্রক্রিয়া তৈরি করে। এটি একটি সেশনে দশ বা বিশ বার করুন এবং আপনার 11 থেকে 21 টি বাশ প্রক্রিয়া সজ্জিত থাকবে। এটি পারফরম্যান্সকে প্রভাবিত করতে পারে এবং আপনি যদি exit(বা Ctrl + D) টাইপ করে পরিষ্কারভাবে সেশনটি শেষ করার চেষ্টা করেন , আপনাকে 11 থেকে 21 বার এটি করতে হবে।
জি-ম্যান

আমি অবশ্যই দেখতে পেতাম যে এটি কোথায় সমস্যা হবে। আমার জন্য যদিও আমি এটি একবার ব্যবহার করছি, আমার প্রয়োজনীয় কাজটি করছিলাম এবং তারপরেই বেরিয়ে আসছি f তবে এটাই যদি আমি পাই তবে আমি তার সাথে বেঁচে থাকতে পারি। অন্যদিকে যদি এর থেকে আরও ভাল সমাধান থাকে তবে আমি এটি দেখতে রাজি আছি।
পল

এই প্রশ্নের উত্তরের এইডিনের উত্তর , শেল ফাংশন ব্যবহার করে এবং শচীন দিভেকারের উত্তর , একটি উপনাম ব্যবহার করা (আইএমও) কোনও স্ক্রিপ্ট ব্যবহারের চেয়ে ভাল সমাধান। পিএস স্ক্রিপ্ট ব্যবহারের অন্য একটি অপূর্ণতা হ'ল, যদি আপনি কোনও শেল বিকল্প (যেমন, dotglobবা  globstar) সেট করেন তবে আপনি  সেগুলি হারাবেন, কারণ আপনি একটি নতুন শেল শুরু করছেন। ... (Cont'd)
জি-ম্যান বলেছেন 'পুনর্বহাল মনিকা'

(চালিয়ে যাওয়া) ... পিপিএস আমি কেবল লক্ষ্য করেছি যে আপনি মূলত সার্জ স্ট্রোব্যান্ডের উত্তরের পুনরাবৃত্তি করছেন এবং বলছেন '' এটি কেন করবেন না? ''  স্ট্যাক এক্সচেঞ্জে আমরা নতুন ধারণা এবং / অথবা তথ্য সরবরাহের উত্তর আশা করি, এবং কেবল আলোচনা করি না অন্যান্য উত্তর।
জি-ম্যান বলেছেন

-1

আপনি এটি একটি ফাংশন ব্যবহার করে বা && ব্যবহার করে করতে পারেন উদাহরণগুলি নমুনা জাবিবিক্স ইনস্টল করে এবং এর ভিতরে একটি লাইন দিয়ে একটি ফাইল তৈরি করে।

উদা:

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