বাশ স্ক্রিপ্ট থেকে বর্তমান ডিরেক্টরিটি পরিবর্তন করুন


190

স্ক্রিপ্ট থেকে বর্তমান ডিরেক্টরি পরিবর্তন করা সম্ভব?

আমি বাশে ডিরেক্টরি নেভিগেশনের জন্য একটি ইউটিলিটি তৈরি করতে চাই। আমি একটি পরীক্ষার স্ক্রিপ্ট তৈরি করেছি যা নিম্নলিখিতগুলির মতো দেখাচ্ছে:

#!/bin/bash
cd /home/artemb

আমি যখন বাশ শেল থেকে স্ক্রিপ্টটি সম্পাদন করি তখন বর্তমান ডিরেক্টরিটি পরিবর্তন হয় না। স্ক্রিপ্ট থেকে বর্তমান শেল ডিরেক্টরিটি পরিবর্তন করা কি আদৌ সম্ভব?


2
কেবলমাত্র একটি বর্ধিতকরণ পরামর্শ: আপনি যদি এর পরিবর্তে pushd(সম্ভবত >/dev/nullএর আউটপুট দমন করতে পুনঃনির্দেশিত ) ব্যবহার করেন তবে cdআপনি পরে এর সাথে পূর্ববর্তী ডিরেক্টরিতে ফিরে যেতে পারেন popd
mklement0

উত্তর:


173

আপনাকে আপনার স্ক্রিপ্টটি শেল ফাংশনে রূপান্তর করতে হবে:

#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
#   . ~/bin/myprog.sh
#

function myprog() {
  A=$1
  B=$2
  echo "aaa ${A} bbb ${B} ccc"
  cd /proc
}

কারণটি হ'ল প্রতিটি প্রক্রিয়াটির নিজস্ব বর্তমান ডিরেক্টরি থাকে এবং আপনি যখন শেল থেকে একটি প্রোগ্রাম চালনা করেন এটি একটি নতুন প্রক্রিয়াতে চালিত হয়। স্ট্যান্ডার্ড "সিডি", "পুশড" এবং "পপড" শেল ইন্টারপ্রেটারের অন্তর্নির্মিত যাতে তারা শেল প্রক্রিয়াটিকে প্রভাবিত করে।

আপনার প্রোগ্রামটিকে শেল ফাংশন তৈরি করে আপনি নিজের ইন-প্রসেস কমান্ড যুক্ত করছেন এবং তারপরে কোনও ডিরেক্টরি পরিবর্তন শেল প্রক্রিয়াতে প্রতিফলিত হয়।


2
আপনি টিসিএস-তে এটি কীভাবে করবেন?
joedborg

4
+1 টি। একটি জিনিস যা আমি লক্ষ্য করেছি সেটি ফাইলটিতে ছিল, এটির কল করার আগে আমাদের ফাংশনটি সংজ্ঞায়িত করতে হবে। এটি আমার মতো অনভিজ্ঞ কাউকে সাহায্য করতে পারে।
ভূষণ

একটি ফাংশন সংজ্ঞায়িত করা এবং একটি উপকরণ তৈরি করার মধ্যে বড় পার্থক্য কী?
হ্যালো গুডবাই

1
একবার আমি এই myprog.sh ফাইলটি তৈরি করে এটি .bashrc এ যুক্ত করেছি আমি কীভাবে স্ক্রিপ্টটি চালাব? আমার ফাংশনটি অন্য শেল ফাইল থেকে বা সরাসরি শেল থেকে কল করা উচিত? দেখে মনে হচ্ছে এটি
আন্দ্রে সিলভেস্ট্রি

1
অ্যান্ড্রিয়াসিলভেস্ট্রি হয় লগ আউট করুন এবং লগ ইন করুন বা উত্স .bashrc। .Bashrc এ এটি যুক্ত করা .বাশার্ক চালানো না হওয়া পর্যন্ত কিছুই করে না।
জন স্ট্রেয়ার

214

আপনি যখন আপনার স্ক্রিপ্ট শুরু করবেন, একটি নতুন প্রক্রিয়া তৈরি হবে যা কেবলমাত্র আপনার পরিবেশকে উত্তরাধিকার সূত্রে প্রাপ্ত। এটি শেষ হলে এটি শেষ হয়। আপনার বর্তমান পরিবেশ যেমন আছে তেমন থাকে।

পরিবর্তে, আপনি এইভাবে আপনার স্ক্রিপ্ট শুরু করতে পারেন:

. myscript.sh

.তাই এটি পরিবর্তন করা যেতে পারে, বর্তমান পরিবেশে স্ক্রিপ্ট মূল্যায়ন করবে


4
+1 কারণ আপনি ঠিক বলেছেন। যদিও আমি আন্তরিকভাবে সন্দেহ করি যে তিনি প্রতিবার যখন প্রয়োজন তখন তিনি একটি ডিরেক্টরি পরিবর্তনকারী স্ক্রিপ্ট উত্স করতে চান। .shতদ্ব্যতীত , এক্সটেনশানগুলি সম্পূর্ণ ইও। এগুলি ব্যবহার করবেন না।
lhunath

1
হ্যাঁ, সাধারণত এটি সেভাবে না ব্যবহার করা ভাল। বেশিরভাগ সময় আপনি খুশি হন যে আপনার বর্তমান পরিবেশের ক্ষতি হয় না। তবে তারপরে আমার কাছে কিছু ঠিকঠাক কাজ করার স্ক্রিপ্ট রয়েছে যাতে ডান জায়গায় বদলানো এবং তারপরে আমি। তাদেরও। BTW। .sh অবশ্যই ব্যক্তিগত স্টাইলের বিষয়। প্রশস্ত স্ক্রিপ্টস সিস্টেমটি ইনস্টল করার সময় আমি সম্ভবত এটি ব্যবহার করব না। তবে আমার ~ / বিনে আমি তাদের কী তা জানার জন্য ব্যবহার করি :)
নরবার্ট হার্টল

11
@ lhunath কেন .sh এক্সটেনশানগুলি সম্পূর্ণ eww?
কার্ল প্রিচেট


1
আমার কাছে সেই নিবন্ধে যুক্তিটি বোগাস্ত্র। দেখে মনে হচ্ছে ফলাফলটি সুস্পষ্টভাবে জানা গেছে তবে এর কারণগুলি খুঁজে পাওয়া এত সহজ ছিল না। তাই আমি আমার বক্তব্যটি দাঁড় করিয়েছি এটি ব্যক্তিগত স্টাইলের বিষয়, অন্য কিছু নয়।
নরবার্ট হার্টল

55

উত্তরের অপঠনযোগ্যতা এবং অত্যধিক জটিলতার আলোকে, আমি বিশ্বাস করি অনুরোধকারীর এটি করা উচিত

  1. স্ক্রিপ্ট যুক্ত করুন PATH
  2. স্ক্রিপ্ট হিসাবে চালান . scriptname

.(DOT) নিশ্চিত স্ক্রিপ্ট একটি শিশু শেল সঞ্চালিত হয় না করব।


38

উপরেরটি একসাথে রেখে, আপনি একটি উপাধি তৈরি করতে পারেন

alias your_cmd=". your_cmd"

আপনি যদি অগ্রণী লিখতে না চান তবে "" প্রতিবার আপনি নিজের স্ক্রিপ্টটি শেল পরিবেশে উত্স করতে চান, বা আপনি যদি মনে রাখতে না চান তবে স্ক্রিপ্টটি সঠিকভাবে কাজ করার জন্য এটি করা আবশ্যক।


এটি কি রিবুটগুলি জুড়ে অবিচল থাকবে?
এসডসোলার

1
@ এসডসোলার এটি অবিচ্ছিন্ন করতে আপনার এটি আপনার ~ / .bashrc ফাইলে যুক্ত করতে হবে। আমার জন্য একটি কবজ ভালো কাজ করে।
রাফাł জি।

~ / .বাশ_লিয়াসে রাখা যেতে পারে
চ্যাম্পে

@ চ্যাম্প ~/.bash_aliasesসবসময় উত্সাহিত হয় না যখন বাশ চালু হয়।
ম্যাটিউজ পাইওটরোস্কি

31

আপনি যদি ব্যাশ ব্যবহার করে থাকেন তবে আপনি ওরফে চেষ্টা করতে পারেন:

.bashrc ফাইলে এই লাইনটি যুক্ত করুন:

alias p='cd /home/serdar/my_new_folder/path/'

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


1
উপনামের জন্য +1। শেল ফাংশন আকর্ষণীয় তবে ওপি সিডির সাথে একটি সহজ নেভ চেয়েছিল। আমি অনুমান করছি যে বেশিরভাগ লোকের উত্স কোড শাখাগুলি নেভিগেট করার জন্য এই জাতীয় স্ক্রিপ্টের প্রয়োজন এবং তার নামটির জন্য যথেষ্ট
ব্র্যাড ড্র্রে

19

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

যদি আপনার কমান্ডটি চালানো লক্ষ্য হয়: গোটো.শ / হোম / টেস্ট তারপরে / হোম / ইন্টারেক্টিভভাবে কাজ করুন / পরীক্ষার এক উপায় হ'ল আপনার স্ক্রিপ্টের মধ্যে বাশ ইন্টারেক্টিভ সাবશેল চালানো:

#!/bin/bash
cd $1
exec bash

এই শেলটির প্রস্থান (প্রস্থান বা সিটিআরএল + সি) না হওয়া পর্যন্ত আপনি এভাবে / হোম / পরীক্ষায় থাকবেন।


আমি ভেবেছিলাম এটি আমার চালিত শেল স্ক্রিপ্টের জন্য সমস্যার সমাধান করবে তবে পরিবর্তে এটি শেলটি শুরু করে এবং আমি যা চাই তা ভুলে যায়।
vwvan

13

সঙ্গে pushd বর্তমান ডিরেক্টরী ডিরেক্টরির স্ট্যাক ধাক্কা এবং এটি দেওয়া নির্দেশিকাতে পরিবর্তন করা হয়, popd স্ট্যাকের উপর ডিরেক্টরির পেতে এবং এটি তারপর পরিবর্তন।

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null

2
এটি আমার প্রশ্নের উত্তর দেয় - একটি সমাধান S3 টি স্ক্রিপ্টের সাথে সক্রিয়ভাবে এই সমাধানটি মোতায়েন করছে এবং এটি পুরোপুরি ভালভাবে কাজ করে। ধন্যবাদ @ এসইবি।
19 ই

5

সহজভাবে যান

yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor

এবং এই কোডটি শেষ লাইনের পাশে যুক্ত করুন:

alias yourcommand="cd /the_path_you_wish"

তারপরে সম্পাদক ছাড়ুন।

তারপরে টাইপ করুন:

source ~/.bashrc or source ~/.bash_profile on MAC.

এখন আপনি ব্যবহার করতে পারেন: টার্মিনালে আপনার কম্যান্ড



3

মূলত আমরা cd..প্রতিটি ডিরেক্টরি থেকে ফিরে আসতে ব্যবহার করি । আমি একবারে আপনাকে ফিরে আসতে হবে এমন ডিরেক্টরিগুলির সংখ্যা দিয়ে এটি আরও সহজ করার জন্য ভাবলাম। আপনি এফেস কমান্ড ব্যবহার করে একটি পৃথক স্ক্রিপ্ট ফাইল ব্যবহার করে এটি প্রয়োগ করতে পারেন। উদাহরণ স্বরূপ:

code.sh

#!/bin/sh
 _backfunc(){
 if [ "$1" -eq 1 ]; then
  cd ..
 elif [ "$1" -eq 2 ]; then
  cd ../..
 elif [ "$1" -eq 3 ]; then
  cd ../../..
 elif [ "$1" -eq 4 ]; then
  cd ../../../..
 elif ["$1" -eq 10]; then
  cd /home/arun/Documents/work
 fi
 }
alias back='_backfunc'   

source code.shবর্তমান শেল ব্যবহার করার পরে আপনি ব্যবহার করতে পারেন:

$back 2 

বর্তমান ডিরেক্টরি থেকে দুটি পদক্ষেপ ফিরে আসতে। এখানে বিস্তারিত ব্যাখ্যা করা হয়েছে । There / .bashrc এ কোডটি কীভাবে রাখবেন সেদিকেও এটি ব্যাখ্যা করা হয়েছে যাতে খোলার প্রতিটি নতুন শেলটিতে স্বয়ংক্রিয়ভাবে এই নতুন ওরফে কমান্ড পাওয়া যায়। আপনি আরও if conditionsবিভিন্ন যুক্তি যুক্ত করে কোডটি সংশোধন করে নির্দিষ্ট ডিরেক্টরিগুলিতে যেতে নতুন কমান্ড যুক্ত করতে পারেন । আপনি এখানে গিট থেকে কোড টানতে পারেন ।


দুর্দান্ত সমাধান, যাতে আপনি কখনই আপনার বাশ প্রোফাইল
গন্ডগোল করেন

0

এই পদ্ধতিটি আমার পক্ষে সহজ।

ধরুন, কোনও ব্যক্তিগত আই-ম্যাকের বিষয়ে যেখানে আপনি প্রশাসক রয়েছেন, যখন একটি কমান্ড উইন্ডো খোলা হয় তখন / ব্যবহারকারী / jdoe, ডিফল্ট ডিরেক্টরিতে, এই ডিরেক্টরিতে যেতে হবে: / বিন।

এই কাজগুলি করতে পারে এমন পদক্ষেপগুলি:

  1. vi মঙ্গোবিন, যেখানে আমি প্রবেশ করলাম: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/binপ্রথম লাইন হিসাবে।
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

ভাল খবর!


0

আমি ছাগল নামে একটি ইউটিলিটিও তৈরি করেছি যা আপনি সহজেই নেভিগেশনে ব্যবহার করতে পারেন।

আপনি গিটহাবের উত্স কোডটি দেখতে পারেন ।

এর মতো v2.3.1 ব্যবহার ওভারভিউ ভালো দেখায়:

# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev

# Follow a link to change a directory:
cd h4xdir

# Follow a link (and don't stop there!):
cd h4xdir/awesome-project

# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...

# List all your links:
goat list

# Delete a link (or more):
goat delete h4xdir lojban

# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents

# Delete all saved links:
goat nuke

# Delete broken links:
goat fix

0

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

তোমার ক্ষেত্রে:

cd /home/artemb

স্ক্রিপ্টটি সংরক্ষণ করুন:

echo cd /home/artemb

তারপরে এটি জ্বালিয়ে দিন:

\`./the_script\`

তারপরে আপনি একই শেল ব্যবহার করে ডিরেক্টরিতে পাবেন।



0

আপনার পথটি ঘোষণা করুন:

PATH='/home/artemb'     
cd ${PATH}

0

PWDআপনার স্ক্রিপ্টের ভিতরে কেবল এটি লিখুন এবং রফতানি করুন এবং পরিবর্তনটি অবিরত থাকবে।

export PWD=/your/desired/directory
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.