কেন "সিডি" শেল স্ক্রিপ্টে কাজ করে না?


766

বর্তমান ডিরেক্টরিটি আমার প্রকল্প ডিরেক্টরিতে পরিবর্তন করতে আমি একটি ছোট স্ক্রিপ্ট লেখার চেষ্টা করছি:

#!/bin/bash
cd /home/tree/projects/java

আমি এই ফাইলটিকে প্রজ হিসাবে সংরক্ষণ করেছি, এর সাথে এক্সিকিউট করার অনুমতি যুক্ত করেছি chmodএবং এতে অনুলিপি করেছি /usr/bin। আমি যখন এটিকে ডাকি:, এটি projকিছুই করে না। আমি কি ভুল করছি?


10
ক্রস সাইটের সদৃশ: superuser.com/questions/176783/…
লেসমানা

ভবিষ্যতে আপনি সর্বদা pwdসর্বশেষ লাইনে এটি পরীক্ষা করার চেষ্টা করতে পারেন । স্ক্রিপ্ট শেষ হওয়ার আগে আপনি পরীক্ষা করতে পারেন এটি কাজ করছে কি না ..
sobi3ch

5
@ লেসমানা কীভাবে এটি একটি সদৃশ?
aland

@aland কারণ ওপি করে না স্ক্রিপ্ট, কেন যে কাজ Dir তার জন্য পরিবর্তন করে না চালানোর আসলে। cdকমান্ড স্ক্রিপ্টগুলির মধ্যে ভাল কাজ করে, নিজের জন্য চেষ্টা করুন।
আলেকজান্ডার গনচি

উত্তর:


634

শেল স্ক্রিপ্টগুলি একটি সাব-শেলের অভ্যন্তরে চালিত হয় এবং বর্তমান ডিরেক্টরিটি কী তা সম্পর্কে প্রতিটি সাব-শেলের নিজস্ব ধারণা রয়েছে। cdসফল, কিন্তু যত তাড়াতাড়ি subshell প্রস্থানের হিসাবে, আপনি ইন্টারেক্টিভ শেল আছেন ফিরে এবং কিছুই কখনো সেখানে পরিবর্তন করেছেন।

এর কাছাকাছি যাওয়ার একটি উপায় পরিবর্তে একটি উপাস ব্যবহার করা হয়:

alias proj="cd /home/tree/projects/java"

7
উপনামগুলি পরিচালনা বা পরিবর্তন করতে এত নমনীয় নয়। অনেকগুলি সিডির ক্ষেত্রে স্ক্রিপ্টগুলি আরও ভাল হতে পারে।
Thevs

16
উপকরণের তুলনায় ফাংশনগুলি আরও নমনীয় হয়, তাই আপনার যদি সেখানে বিকল্পগুলি পর্যাপ্ত না থাকে তবে আপনি সেখানে তাকান।
প্রথম দিন

4
এমএস-ডস-এ, স্ক্রিপ্টগুলির আচরণটি কি লক্ষণীয় যে কোনও কলিত স্ক্রিপ্ট কলিং কমান্ড শেলের ডিরেক্টরি (এবং এমনকি ড্রাইভ) পরিবর্তন করতে পারে? এবং যে ইউনিক্স এই ত্রুটি আছে না?
জোনাথন লেফলার

23
জোনাথন: যদিও এটি সত্য, এটি আসলে প্রশ্নের সাথে সম্পর্কিত নয়। এমএস-ডসের সাথে সম্পর্কিত প্রতিটি ঘাটতি যদি প্রতিটি তালিকায় থাকে তবে এসও-তে উত্তরগুলি দ্বিগুণ হয়ে যাবে!
গ্রেগ হিউগিল

17
এটির কাছাকাছি যাওয়ার আরও একটি উপায় হ'ল স্ক্রিপ্ট ফাইলটি উত্স: . my-scriptবা source my-script
হ্যালো গুডবাই

503

আপনি কিছু ভুল করছেন না! আপনি ডিরেক্টরিটি পরিবর্তন করেছেন, তবে কেবল স্ক্রিপ্টটি চালিত সাব-শেলের মধ্যে।

আপনি "ডট" কমান্ড দিয়ে আপনার বর্তমান প্রক্রিয়াতে স্ক্রিপ্টটি চালাতে পারেন:

. proj

তবে আমি এই সাধারণ ক্ষেত্রে একটি উপাধি ব্যবহারের জন্য গ্রেগের পরামর্শটিকে পছন্দ করব


95
.এছাড়াও বানানযুক্ত source, আপনি যাকে আরও স্মরণীয় মনে করুন তা চয়ন করুন।
প্রথম দিন

47
@ ইফেমিয়েন্ট: ভাল পয়েন্টসোর্স যা এটি ব্যাখ্যা করে যে এটি ওয়ার্কসোর্সটিও প্রমাণ করে যে অলসতা-প্রয়োজন নয় - প্রায়শই আবিষ্কারের উত্সের জননী
অ্যাডাম লিস

8
@ ফেফিয়েন্ট: নোটটি উত্সটি সি শেল এবং ব্যাশে ব্যবহৃত হয়; এটি পসিক্স বা কর্ন শেলস বা ক্লাসিক বোর্ন শেল সমর্থন করে না।
জোনাথন লেফলার

2
"উত্স" জেড শেল ব্যবহার করা হয়েছে
নাথান মুস

1
@ অ্যাডলিস এটি দুর্দান্ত কাজ করে তবে একটি ব্যর্থতা রয়েছে - কোনওভাবে সোর্স / ডট কমান্ডটি ট্যাব কী দিয়ে স্ক্রিপ্ট / কমান্ডের স্বতঃপূর্ণ নাম সম্ভাবনাটিকে অক্ষম করে। এখনও টিএবি কী দিয়ে যুক্তি / ইনপুট যুক্ত করা সম্ভব তবে দুর্ভাগ্যক্রমে কমান্ডের নামটি সরাসরি ইনপুট হওয়া দরকার। এক্ষেত্রে কীভাবে ট্যাব কীটি তৈরি করবেন তা আপনি জানেন?
রাফাল

215

cdআপনার স্ক্রিপ্টের মধ্যে টেকনিক্যালি কাজ যেমন শেল স্ক্রিপ্ট দৌড়ে নির্দেশিকা পরিবর্তিত, কিন্তু যে একটি আলাদা প্রক্রিয়া আপনার ইন্টারেক্টিভ শেল থেকে forked ছিল।

এই সমস্যাটি সমাধান করার জন্য একটি পজিক্স-সামঞ্জস্যপূর্ণ উপায় হ'ল শেল-ইনভোকড কমান্ড স্ক্রিপ্টের পরিবর্তে শেল পদ্ধতিটি সংজ্ঞায়িত করা ।

jhome () {
  cd /home/tree/projects/java
}

আপনি কেবল এটি টাইপ করতে পারেন বা এটি বিভিন্ন শেল স্টার্টআপ ফাইলগুলির মধ্যে একটিতে রাখতে পারেন।


6
আমি সম্মতি জানাই, এটি সেরা উত্তর, ধাক্কা মেরে। এছাড়াও, উরফ কিছু পরিস্থিতিতে উপযুক্ত হতে পারে তবে তিনি যদি কোনও স্ক্রিপ্টে সিডি ব্যবহারের চেষ্টা করছেন এবং এর সাথে অন্য কোনও কিছু যুক্ত করতে চান তবে একটি উপন্যাস অকেজো হবে।
জাস্টিন বুজার

4
এটি একটি সমাধান মত দেখায়! এবং আমি তা বাস্তবায়ন করার চেষ্টা করছি, কিন্তু এটা করণ না :( এখানে আমার স্ক্রিপ্টের: # / বিন / ব্যাশ jhome () {প্রতিধ্বনি "দয়া করে" সিডি / হোম প্রতিধ্বনি "কাজ"} jhome!
Gant Laborde

1
@ গ্যান্টম্যান, আপনার এটি "শেল স্টার্টআপ ফাইলগুলিতে" যোগ করা উচিত, যেমন ~ / .bashrc
জ্যাকি ইয়ে

3
আপনি একটি আর্গুমেন্ট (বা দুটি ... )ও ব্যবহার করতে পারেন, যেমন:jhome(){ cd /home/tree/projects/$1; }
ইরবানা

1
এটি সঠিক উপায়ে হওয়া উচিত, এটি বিশেষ অক্ষর যেমন "-" উদাহরণস্বরূপ ব্যবহার করা সম্ভব করে তোলে।
ব্যাংককগুয়ে

159

cdস্ক্রিপ্টের শেল মধ্যে সম্পন্ন করা হয়। স্ক্রিপ্টটি শেষ হয়ে গেলে, সেই শেলটি প্রস্থান করে এবং তারপরে আপনি যে ডিরেক্টরিতে ছিলেন সেগুলি আপনি রেখে যান। "উত্স" স্ক্রিপ্ট, এটি চালাবেন না। পরিবর্তে:

./myscript.sh

করা

. ./myscript.sh

(স্ক্রিপ্ট নামের আগে বিন্দু এবং স্থান লক্ষ্য করুন।)


2
এটি দুর্দান্ত, এবং সম্ভবত এটি জানা ভাল। পরবর্তীরা ঠিক কী করে (যদিও এটি কাজ করে)? এটি সম্ভবত এই থ্রেডের সেরা সমাধান।
জোনা

2
fww, অ্যাডাম লিস এর উত্তর বিভাগে, উত্তর 'কী' এই প্রশ্নের উত্তর দেয়। হয়। এটি একই জিনিসsource
g19fanatic

1
সাবধান, "উত্স" একটি বাশিজম যেমন ড্যাশ (/ বিন / শের জন্য ডেবিয়ান ডিফল্ট) এটি সমর্থন করে না, যখন "।" প্রত্যাশার মতো কাজ করে।
Allo

দুর্দান্ত উত্তর! এছাড়াও myscript.sh$ PATH- র অন্তর্ভুক্ত কোনও ডিরেক্টরিতে থাকলে, আপনি পুরো পথটি নির্দিষ্ট না করেই যে কোনও জায়গা থেকে এটি উত্স করতে পারেন।
কোডব্রু

এটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। এই সমাধানটি সহজতম (+1)।
HuserB1989

96

কোনও বাশ স্ক্রিপ্ট তৈরি করতে যা একটি নির্বাচিত ডিরেক্টরিতে সিডি করবে:

স্ক্রিপ্ট ফাইল তৈরি করুন

#! / বিন / SH
# ফাইল: / স্ক্রিপ্ট / সিডিজাভা
#
সিডি / বাড়ি / আসকেলাল / প্রকল্প / জাভা

তারপরে আপনার স্টার্টআপ ফাইলটিতে একটি উপাধি তৈরি করুন।

#! / বিন / SH
# ফাইল / স্ক্রিপ্টস / মাস্টারকোড.শ
#
ওরফে সিডজভা = '। / স্ক্রিপ্ট / cdjava '

  • আমি একটি স্টার্টআপ ফাইল তৈরি করেছি যেখানে আমি আমার সমস্ত উপকরণ এবং কাস্টম ফাংশন ডাম্প করি।
  • তারপরে আমি প্রতিটি ফাইল বুট করার জন্য এই ফাইলটি আমার .bashrc এ উত্সিত করি।

উদাহরণস্বরূপ, একটি মাস্টার নাম / ফাংশন ফাইল তৈরি করুন: /scriptts/mastercode.sh
(এই ফাইলের মধ্যে উপনাম রাখুন))

তারপরে আপনার .bashrc ফাইলটির শেষে :

উত্স / স্ক্রিপ্টস / মাস্টারকোড.শ



এখন আপনার জাভা ডিরেক্টরিতে সিডি করা সহজ, কেবল সিডিজাভা টাইপ করুন এবং আপনি সেখানে আছেন।


2
ফাইলটির mastercode.shশাবাং ( #!/bin/sh) দরকার নেই , যেহেতু এটি একটি সাবশেলে কার্যকর করা হয় না (এবং এটি করা যায় না)। তবে একই সাথে, আপনাকে এই ফাইলটির শেল "গন্ধ" নথিভুক্ত করতে হবে; উদাহরণস্বরূপ, ksh বা বাশ (বা (টি) csh / zsh, ইত্যাদি), এবং এটি প্রায় অবশ্যই বাস্তবে নয় sh। আমি এটি যোগাযোগ করার জন্য সাধারণত একটি মন্তব্য (তবে শেবাং নয়) যুক্ত করি; উদাহরণস্বরূপ, "এই ফাইলটি উত্সাহিত (বাশ থেকে) বোঝানো হয়েছে, শেল স্ক্রিপ্ট হিসাবে চালানো হয় না" "
মাইকেল 25 ই

আরেকটি টিপ (বাশের জন্য): আপনি যদি আপনার স্ক্রিপ্টে ভেরিয়েবল ব্যবহার করেন, তবে স্ক্রিপ্টটি sourceডি হচ্ছে (এর মাধ্যমে alias), সেই পরিবর্তনগুলি আপনার শেল পরিবেশে ফাঁস হবে into এটি এড়াতে, স্ক্রিপ্টের সমস্ত কাজ কোনও ফাংশনে করুন এবং স্ক্রিপ্টের শেষে কেবল এটি কল করুন। ফাংশনের মধ্যে, কোনও ভেরিয়েবল ঘোষণা করুন local
রোববার্ব

উবুন্টুতে কেবল ~ / .bash_aliases তৈরি করুন (এটি ইতিমধ্যে উপস্থিত না থাকলে)। তারপরে সেখানে কেবল আপনার এলিয়াস যুক্ত করুন, টার্মিনালটি পুনরায় আরম্ভ করুন এবং আপনার কাজ শেষ।
ভ্লাদ

51

আপনি .বর্তমান শেল পরিবেশে একটি স্ক্রিপ্ট কার্যকর করতে ব্যবহার করতে পারেন :

. script_name

অথবা বিকল্পভাবে, এটি আরও পঠনযোগ্য তবে শেল নির্দিষ্ট নাম source:

source script_name

এটি সাব- cdশেল এড়িয়ে যায় এবং পরিবর্তে বর্তমান শেলটিকে কোনও ভেরিয়েবল বা বিল্টিন (সহ ) সরবরাহ করতে দেয়।


38

জেরেমি রুটেনের একটি সিমিলিংক ব্যবহারের ধারণাটি এমন একটি চিন্তাকে উত্সাহিত করেছিল যা অন্য কোনও উত্তর অতিক্রম করে না। ব্যবহার করুন:

CDPATH=:$HOME/projects

নেতৃস্থানীয় কোলন গুরুত্বপূর্ণ; এর অর্থ হ'ল যদি বর্তমান ডিরেক্টরিতে ডিরেক্টরি 'দির' থাকে তবে cd dirঅন্য কোথাও আশা না করে ' ' এর পরিবর্তিত হবে। প্রদর্শিত মান হিসাবে প্রদর্শিত হিসাবে, আপনি এটি করতে পারেন:

cd java

এবং, যদি বর্তমান ডিরেক্টরিতে জাভা নামে কোনও উপ-ডিরেক্টরি না থাকে, তবে এটি আপনাকে সরাসরি $ হোম / প্রকল্প / জাভাতে নিয়ে যাবে - কোনও এলিয়াস, কোনও স্ক্রিপ্ট, কোনও সন্দেহজনক এক্সিকিউট বা ডট কমান্ড নেই।

আমার OME HOM হ'ল / ব্যবহারকারী / jleffler; আমার $ সিডিপ্যাট হ'ল:

:/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work

30

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

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

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

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

#!/usr/bin/env bash
cd /home/tree/projects/java
exec bash

16
এটি একটি নতুন সাবসেল তৈরি করে। আপনি যখন টাইপ করবেন exitআপনি শেলটিতে ফিরে আসবেন যেখানে আপনি এই স্ক্রিপ্টটি চালিয়েছেন।
ট্রিপলি

1
যখন স্ক্রিপ্টটি বেশ কয়েকবার কল করা হয়েছিল বলে মনে হয় এটি নেস্টেড শেল তৈরি করে এবং আমাকে অনেকবার 'প্রস্থান' টাইপ করতে হবে। এটি কি কোনওভাবে সমাধান করা যায়?
ভ্লাদসভিটস্কি

অন্যান্য উত্তরগুলি দেখুন: একটি নাম ব্যবহার করুন, "পুশড / পপড / ডায়ার্স" ব্যবহার করুন, বা "উত্স" ব্যবহার করুন
কুইনিল

25

আমি ব্যবহার করে আমার কোড পেয়েছি. <your file name>

./<your file name> ডোজ কাজ করে না কারণ এটি আপনার ডিরেক্টরিটি টার্মিনালে পরিবর্তন করে না এটি কেবল সেই স্ক্রিপ্টের জন্য নির্দিষ্ট ডিরেক্টরিটি পরিবর্তন করে।

এখানে আমার প্রোগ্রাম

#!/bin/bash 
echo "Taking you to eclipse's workspace."
cd /Developer/Java/workspace

এখানে আমার টার্মিনাল

nova:~ Kael$ 
nova:~ Kael$ . workspace.sh
Taking you to eclipe's workspace.
nova:workspace Kael$ 

2
মধ্যে পার্থক্য কি . somethingএবং ./something?? এই উত্তরটি আমার পক্ষে কাজ করেছিল এবং কেন তা আমি বুঝতে পারি না।
Dracorat

. something, আপনি যে কোনো অবস্থান থেকে স্ক্রিপ্ট চালাতে সক্ষম ./somethingডিরেক্টরির ফাইলে সংরক্ষণ করা হয় হতে করতে হবে।
Projjol


আপনি কি শেবাং লাইনে বিন্দু রাখতে পারবেন? #!. /bin/bash?
সিগফ্রিড


12

আপনি যখন শেল স্ক্রিপ্ট ফায়ার করেন, এটি সেই শেলটির একটি নতুন উদাহরণ ( /bin/bash) চালায় । সুতরাং, আপনার স্ক্রিপ্টটি কেবল একটি শেল জ্বালিয়ে দেয়, ডিরেক্টরি পরিবর্তন করে এবং প্রস্থান করে। cdশেল স্ক্রিপ্টের মধ্যে অন্য একটি উপায় রাখুন, (এবং অন্যান্য কমান্ডগুলি) সেগুলি যে শেলটি থেকে চালু হয়েছিল তাতে প্রভাব ফেলবে না বা তাদের প্রবেশাধিকার পাবে না।


11

আমার বিশেষ ক্ষেত্রে একই ডিরেক্টরিতে পরিবর্তন করার জন্য আমার অনেক বার প্রয়োজন হয়েছিল। সুতরাং আমার .bashrc এ (আমি উবুন্টু ব্যবহার করি) আমি যুক্ত করেছি

1 -

$ ন্যানো ~। / বাশার্ক

 function switchp
 {
    cd /home/tree/projects/$1
 }

2-

$ উত্স ~ / .bashrc

3 -

$ সুইচপ জাভা

সরাসরি এটি করবে: সিডি / হোম / ট্রি / প্রজেক্ট / জাভা

আশা করি এইটি কাজ করবে!


1
@WM আপনি প্রকল্পের
গাছটিতে

2
@ ওয়ার্কড্রেমার আপনার উপরে উল্লিখিত ফাংশন পদ্ধতির বিষয়টি আমার সিস্টেমে একই প্যারেন্ট ফোল্ডার সহ সাব-ফোল্ডারগুলিতে যাওয়ার ক্ষেত্রে এখানে একটু সমস্যা সমাধান করেছে। ধন্যবাদ.
ডাব্লুএম

10

আপনি নিম্নলিখিত করতে পারেন:

#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash

সম্পাদনা: পরবর্তী শেলগুলি রোধ করতে এটি 'বিন্দু' হতে পারে।

উদাহরণ:

. ./previous_script  (with or without the first line)

1
এটি কয়েক রানের পরে বরং অগোছালো হয়ে যায় .. exitশেলটি থেকে বেরিয়ে আসতে আপনাকে বেশ কয়েকবার (বা সিআরটিএল + ডি) করতে হবে, উদাহরণস্বরূপ .. একটি উপাধি এত বেশি ক্লিনার (এমনকি শেল কমান্ড ডিরেক্টরিকে আউটপুট করেও দেয় এবং এটি সিডি করে দেয়) আউটপুট - ওরফে কিছু = "সিডি getnewdirectory.sh")
dbr

'Exec' নোট করুন Note এটি পুরানো শেলের প্রতিস্থাপন করে।
Thevs

2
এক্সিকিউটর কেবলমাত্র সেই উপ-শেলকে প্রতিস্থাপন করবে যা সিডি কমান্ডটি চালাচ্ছিল, স্ক্রিপ্টটি চালিত শেল নয়। আপনি যদি স্ক্রিপ্টটি আঁকেন, তবে আপনি সঠিক হবেন।
জোনাথন লেফলার

এটিকে 'ডটেড' করুন - কোনও সমস্যা নেই। আমি সলিউশনের প্রস্তাব দিয়েছি মাত্র। আপনি কীভাবে এটি চালু করবেন তা নির্ভর করে না।
Thevs

2
ওহে, আমি মনে করি কেবল সিডি কমান্ডের সাহায্যে এক-লাইন স্ক্রিপ্টকে ডট করা ভাল :) :) আমি আমার উত্তর যেভাবেই রাখব ... এটি ভুল বোকামি প্রশ্নের সঠিক বোকা উত্তর হবে :)
থিভস

7

এটি কেবলমাত্র স্ক্রিপ্টের জন্য ডিরেক্টরি পরিবর্তন করে, যখন আপনার বর্তমান ডিরেক্টরি একই থাকে।

পরিবর্তে আপনি প্রতীকী লিঙ্কটি ব্যবহার করতে চাইতে পারেন । এটি আপনাকে কোনও ফাইল বা ডিরেক্টরিতে একটি "শর্টকাট" তৈরি করতে দেয়, সুতরাং আপনাকে কেবল এমন কিছু টাইপ করতে হবে cd my-project


প্রতিটি ডিরেক্টরিতে এই সিমলিংক থাকা একটি উপদ্রব হবে। এই সিমলিংকটি $ HOM এ রাখা এবং তারপরে 'সিডি ~ / আমার-প্রকল্প' করা সম্ভব হবে। স্পষ্টতই, যদিও, এটি CDPATH ব্যবহার করা সহজ।
জোনাথন লেফলার

7

আরও গতিশীল হতে পারে এমন কিছু করার জন্য আপনি অ্যাডাম এবং গ্রেগের ওরফে এবং ডট পদ্ধতির একত্রিত করতে পারেন —

alias project=". project"

এখন প্রজেক্টের ওরফে চলমান সাব-শেলের বিপরীতে বর্তমান শেলের মধ্যে প্রকল্পের স্ক্রিপ্ট কার্যকর করবে।


আমার সমস্ত স্ক্রিপ্টটি বজায় রাখতে এবং কেবল এটি থেকে ডাকা এবং বর্তমান সেশনটি বজায় রাখতে আমার ঠিক এটির প্রয়োজন ছিল - এটি পারফেক্ট উত্তর।
ম্যাট দ্য নিনজা

7

আপনি একটি নাম এবং স্ক্রিপ্ট একত্রিত করতে পারেন,

alias proj="cd \`/usr/bin/proj !*\`"

প্রদত্ত স্ক্রিপ্ট গন্তব্য পথ প্রতিধ্বনি। নোট করুন যে সেগুলি স্ক্রিপ্টের নাম ঘিরে ব্যাকটিক্স। 

উদাহরণস্বরূপ, আপনার স্ক্রিপ্ট হতে পারে

#!/bin/bash
echo /home/askgelal/projects/java/$1

এই কৌশলটির সাথে সুবিধাটি হ'ল স্ক্রিপ্টটি অনেকগুলি কমান্ড লাইন প্যারামিটার নিতে পারে এবং সম্ভবত জটিল যুক্তি দ্বারা গণনা করা বিভিন্ন গন্তব্য নির্গত করতে পারে।


3
কেন? আপনি শুধু ব্যবহার করতে পারে: proj() { cd "/home/user/projects/java/$1"; }=> proj "foo"(অথবা, proj "foo bar"<= যদি আপনি শূণ্যস্থান আছে) ... বা এমনকি (উদাহরণস্বরূপ): proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }=> proj a b c=> একটি করে cdপ্রবেশ/home/user/projects/java/a/b/c
মাইকেল

6

দ্রুত ডিরেক্টরিতে নেভিগেট করতে there's সিডিপ্যাথ, সিডারগস এবং স্বয়ংক্রিয়ভাবে এলিয়াস উত্পন্ন করার উপায় রয়েছে

http://jackndempsey.blogspot.com/2008/07/cdargs.html

http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html

https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html


5

আপনার ~ / .bash_ প্রোফাইলে ফাইলটিতে। পরবর্তী ফাংশন যোগ করুন

move_me() {
    cd ~/path/to/dest
}

টার্মিনাল পুনরায় আরম্ভ করুন এবং আপনি টাইপ করতে পারেন

move_me 

এবং আপনি গন্তব্য ফোল্ডারে সরানো হবে।


3

আপনি অপারেটর && ব্যবহার করতে পারেন:

সিডি মাইডাইরেক্টরি অ্যান্ড অ্যান্ড এলএস


ডাউনভোট: এটি এখানে প্রকৃত প্রশ্নের উত্তর দেওয়ার চেষ্টা করে না। আপনি প্রম্পটে দুটি কমান্ড চালাতে পারেন ( &&আপনি যদি দ্বিতীয়টি প্রথমটিতে শর্তযুক্ত করতে চান তবে বা ;তাদের মধ্যে কেবল নতুন লাইন দিয়ে) তবে এটি কোনও স্ক্রিপ্টে রাখলে আপনি "পিতামাতার শেলটি কেন ব্যবহার করবেন না" তে ফিরে যাবে নতুন ডিরেক্টরি cdআসলে কখন সফল হয়েছিল? "
ট্রিপলি

3

আপনি যে স্ক্রিপ্টটি চালাতে চান তা সোর্স করার সময়, আপনার সচেতন হওয়া উচিত যে এই স্ক্রিপ্টটি সরাসরি আপনার বর্তমান শেলের পরিবেশ পরিবর্তন করতে পারে। এছাড়াও তর্কগুলি আর পাস করা সম্ভব নয়।

করার আরেকটি উপায় হ'ল আপনার স্ক্রিপ্টটি ব্যাশে ফাংশন হিসাবে প্রয়োগ করা।

function cdbm() {
  cd whereever_you_want_to_go
  echo "Arguments to the functions were $1, $2, ..."
}

শেল ডিরেক্টরি বুকমার্কগুলি শেখার জন্য এই কৌশলটি অটোজাম্প: http://github.com/joelthelion/autojump/wiki দ্বারা ব্যবহৃত হয় ।


3

আপনি আপনার নীচের মতো একটি ফাংশন তৈরি করতে পারেন .bash_profileএবং এটি কার্যকরভাবে কাজ করবে।

নিম্নলিখিত ফাংশনটি একটি isচ্ছিক পরামিতি নেয় যা একটি প্রকল্প। উদাহরণস্বরূপ, আপনি কেবল চালাতে পারেন

cdproj

অথবা

cdproj project_name

এখানে ফাংশন সংজ্ঞা।

cdproj(){
    dir=/Users/yourname/projects
    if [ "$1" ]; then
      cd "${dir}/${1}"
    else
      cd "${dir}"
    fi
}

আপনার উত্স করতে ভুলবেন না .bash_profile



এই সমাধানটি এর সরলতা এবং নমনীয়তায় উজ্জ্বল।
Kjartan

3

এটি আপনার যা করা উচিত তা করা উচিত। আগ্রহের ডিরেক্টরিতে পরিবর্তন করুন (স্ক্রিপ্টের মধ্যে থেকে) এবং তারপরে একটি নতুন ব্যাশ শেলটি তৈরি করুন।

#!/bin/bash

# saved as mov_dir.sh
cd ~/mt/v3/rt_linux-rt-tools/
bash

আপনি যদি এটি চালনা করেন তবে এটি আপনাকে আগ্রহের ডিরেক্টরিতে নিয়ে যাবে এবং আপনি এটি থেকে বেরিয়ে গেলে এটি আপনাকে আসল জায়গায় ফিরিয়ে আনবে।

root@intel-corei7-64:~# ./mov_dir.sh

root@intel-corei7-64:~/mt/v3/rt_linux-rt-tools# exit
root@intel-corei7-64:~#

আপনি যখন প্রস্থান করবেন তখন এটি আপনাকে আপনার মূল ডিরেক্টরিতে ফিরে নিয়ে যাবে ( CTRL+ d)


3
নতুন ব্যাশ তৈরির অর্থ হ'ল আপনি আপনার ইতিহাস হারাবেন এবং এটি নতুন করে শুরু হবে।
টিছা

2

লুওআংয়ের পরেও, তবে আমি নিম্নলিখিতগুলি করেছি:

কেস নামক একটি ফাইল তৈরি করুন

নিম্নলিখিত ফাইলটি পেস্ট করুন:

#!/bin/sh

cd /home/"$1"

এটি সংরক্ষণ করুন এবং তারপরে:

chmod +x case

আমি আমার একটি নামও তৈরি করেছি .bashrc:

alias disk='cd /home/; . case'

এখন যখন আমি টাইপ করি:

case 12345

মূলত আমি টাইপ করছি:

cd /home/12345

আপনি 'কেস' এর পরে যে কোনও ফোল্ডার টাইপ করতে পারেন:

case 12

case 15

case 17

যা টাইপ করার মতো:

cd /home/12

cd /home/15

cd /home/17

যথাক্রমে

আমার ক্ষেত্রে পথটি দীর্ঘতর - এই ছেলেরা এটি আগে ~ তথ্য দিয়ে সংক্ষেপে লিখেছিল।


1
cdওরফে মধ্যে প্রয়োজনের অতিরিক্ত এবং অসুন্দর হয়; উপাধি সহজভাবে করা উচিত '। পরিবর্তে `/ কেস` এছাড়াও caseএকটি সংরক্ষিত কীওয়ার্ড, সুতরাং একটি নামের জন্য বরং বরং দুর্বল পছন্দ।
ট্রিপলি

1

আপনার কোনও স্ক্রিপ্টের দরকার নেই, কেবল সঠিক বিকল্পটি সেট করুন এবং একটি পরিবেশের পরিবর্তনশীল তৈরি করুন।

shopt -s cdable_vars

আপনার পরিবেশের ভেরিয়েবলের সামগ্রীতে ~/.bashrcঅনুমতি দেয় cd

এ জাতীয় পরিবেশ পরিবর্তনশীল তৈরি করুন:

export myjava="/home/tree/projects/java"

এবং আপনি ব্যবহার করতে পারেন:

cd myjava

অন্যান্য বিকল্প


0

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

function proj
   cd /home/tree/projects/java
end
funcsave proj

এটি ফাংশনটি তৈরি করবে এবং এটি পরে ব্যবহারের জন্য সংরক্ষণ করবে। যদি আপনার প্রকল্পের পরিবর্তন হয়, কেবল নতুন পথটি ব্যবহার করে প্রক্রিয়াটি পুনরাবৃত্তি করুন।

আপনি যদি পছন্দ করেন তবে নিম্নলিখিত কাজগুলি করে ম্যানুয়ালি ফাংশন ফাইল যুক্ত করতে পারেন:

nano ~/.config/fish/functions/proj.fish

এবং পাঠ্য প্রবেশ করান:

function proj
   cd /home/tree/projects/java
end

এবং অবশেষে প্রস্থান করতে সিটিটিএল + এক্স টিপুন এবং y পরিবর্তনগুলি সংরক্ষণ করতে ফিরে আসুন।

( দ্রষ্টব্য: ফানকস্যাভ ব্যবহারের প্রথম পদ্ধতিটি আপনার জন্য প্রোজ.ফিশ ফাইল তৈরি করে )।


0


Github.com/godzilla/bash-stuff এ ডিরেক্টরি পরিবর্তন করার জন্য আমার কাছে পি নামক একটি সরল বাশ স্ক্রিপ্ট রয়েছে যা
কেবলমাত্র আপনার স্থানীয় বিন ডিরেক্টরিতে (/ usr / স্থানীয় / বিন) স্ক্রিপ্টটি
রেখে দিন

alias p='. p'

আপনার .bashrc এ


এটা কি করে? দেখে মনে হচ্ছে এটি পুনরাবৃত্তভাবে নিজেই চালিত হবে, যদিও আমি নিশ্চিত যে আপনি এটি চালানোর আগে চালনা করেন কিনা;)
রায়ান টেলর

0

আলোচনাটি নোট করুন আমি কীভাবে পিতামাতার প্রক্রিয়ার ওয়ার্কিং ডিরেক্টরি সেট করব?

এটিতে কিছু হ্যাকিশ উত্তর রয়েছে, যেমন https://stackoverflow.com/a/2375174/755804 (gdb এর মাধ্যমে প্যারেন্ট প্রসেস ডিরেক্টরিটি পরিবর্তন করা, এটি করবেন না) এবং https://stackoverflow.com/a/51985735/755804 ( কমান্ড tailcdযে উদ্বুদ্ধ সিডি dirname পিতা বা মাতা প্রক্রিয়ার ইনপুট স্ট্রিম করা; ভাল, আদর্শভাবে বরং এটা একটি হ্যাক চেয়ে ব্যাশ একটি অংশ হওয়া উচিত)


0

এটি একটি পুরানো প্রশ্ন, তবে আমি সত্যিই অবাক হয়েছি আমি এখানে এই কৌশলটি দেখছি না

সিডি ব্যবহারের পরিবর্তে আপনি ব্যবহার করতে পারেন

export PWD=the/path/you/want

সাবসেল তৈরি বা উপকরণ ব্যবহার করার দরকার নেই।

মনে রাখবেন যে / পথ / আপনি / চান চান তা নিশ্চিত করা আপনার দায়িত্ব।


দুর্ভাগ্যক্রমে কাজ হয়নি।
ttfreeman

0

অন্যান্য উত্তরে বর্ণিত হিসাবে, আপনি ডিরেক্টরিটি পরিবর্তন করেছেন, তবে কেবলমাত্র সাব-শেলের মধ্যে যা স্ক্রিপ্টটি চালায় । এটি প্যারেন্ট শেলকে প্রভাবিত করে না।

একটি সমাধান হ'ল বাশ স্ক্রিপ্ট ( ) এর পরিবর্তে ব্যাশ ফাংশন ব্যবহার করা sh; কোনও ফাংশনে আপনার বাশ স্ক্রিপ্ট কোড স্থাপন করে। এটি কমান্ড হিসাবে ফাংশনটি উপলভ্য করে এবং তারপরে, এটি একটি শিশু প্রক্রিয়া ছাড়াই কার্যকর করা হবে এবং এইভাবে কোনও cdকমান্ড কলার শেলকে প্রভাবিত করবে।

বাশ ফাংশন:

ব্যাশ প্রোফাইলের একটি বৈশিষ্ট্য হ'ল কাস্টম ফাংশনগুলি সংরক্ষণ করা যা টার্মিনালে বা ব্যাশ স্ক্রিপ্টগুলিতে চালানো যেতে পারে আপনি যেভাবে অ্যাপ্লিকেশন / কমান্ডগুলি চালান এটি দীর্ঘ কমান্ডের শর্টকাট হিসাবেও ব্যবহৃত হতে পারে।

আপনার কার্যকারিতাটি কার্যকরভাবে কার্যকর করার জন্য আপনাকে বেশ কয়েকটি ফাইলের শেষে আপনার ফাংশনটি অনুলিপি করতে হবে

/home/user/.bashrc
/home/user/.bash_profile
/root/.bashrc
/root/.bash_profile

আপনি sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profileসেই ফাইলগুলি দ্রুত সম্পাদনা / তৈরি করতে পারবেন

কিভাবে :

আপনার বাশের প্রোফাইল ফাইলের শেষে আপনার বাশ স্ক্রিপ্ট কোডটি একটি নতুন ফাংশনের অভ্যন্তরে অনুলিপি করুন এবং আপনার টার্মিনালটি পুনরায় চালু করুন, তারপরে আপনি চালাতে পারেন cddবা যে ফাংশনটি আপনি লিখেছেন তা করতে পারেন ।

স্ক্রিপ্ট উদাহরণ

এর cd ..সাথে শর্টকাট তৈরি করাcdd

cdd() {
  cd ..
}

শর্টকাট

ll() {
  ls -l -h
}

শর্টকাট

lll() {
  ls -l -h -a
}

-2

আপনি যদি ব্যাকস্ল্যাশ দিয়ে লাইন শেষ করেন তবে আপনি একই সাবশেলে কিছু লাইন কার্যকর করতে পারেন।

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