ডিরেক্টরিতে সিডিতে এলিয়াস রেখে একটি কমান্ড কল করুন


21

আমার একটি আছে .bash_profileএবং এটিতে আমার একটি উপাত্তের সেট রয়েছে। এই মুহুর্তে এই উপাধিগুলি কেবল একটি কমান্ড কার্যকর করে এবং এটি মোটামুটি সহজ ছিল। আমি তবে একটি নতুন উপন্যাসের সাথে দুটি জিনিস করতে চাই যা আমি তৈরির চেষ্টা করছি।

  1. ডিরেক্টরিতে সিডি
  2. এই ডিরেক্টরি থেকে একটি কমান্ড চালান

উত্তর:


26

একটি নির্দিষ্ট ওয়ার্কিং ডিরেক্টরি সহ একটি কমান্ড চালানো, সাধারণত একটি করে

( cd directory && utility )

চারপাশের প্রথম বন্ধনীর cd ...অর্থ হ'ল এতে কমান্ড (গুলি) একটি সাব-শেলের মধ্যে চলে। ওয়ার্ক ডিরেক্টরিটি একটি সাবশেলে পরিবর্তন করা এটিকে তৈরি করে যাতে কলিং শেলের বর্তমান কার্যকরী ডিরেক্টরিটি পরিবর্তিত হয় না, অর্থাত্ এই আদেশটি ডেকে নেওয়ার পরেও আপনি যে ডিরেক্টরিটি শুরু করেছিলেন সেখানেই অবস্থিত থাকবেন।

উদাহরণ:

( cd / && echo "$PWD" )  # will output "/"
echo "$PWD"              # will output whatever directory you were in at the start

এটিকে কোনও জেনেরিক ওরফে রূপান্তর করা যায় না কারণ একটি উপাস কোনও যুক্তি নিতে পারে না।

একটি নির্দিষ্ট ডিরেক্টরি এবং ইউটিলিটির জন্য, কেউ এটি করতে পারে

alias cdrun='( cd "$HOME/somedir" && ./script.sh )'

তবে সাধারণ ক্ষেত্রে আপনাকে শেল ফাংশন ব্যবহার করতে হবে:

cdrun () {
    ( cd "$1" && shift && command "$@" )
}

অথবা

cdrun () (
    cd "$1" && shift && command "$@"
)

ফাংশনের দেহের চারপাশে কোঁকড়া ধনুর্বন্ধনী প্রতিস্থাপন ফাংশনটিকে তার নিজস্ব সাবশেলে সম্পাদন করে।

এটি হিসাবে ব্যবহৃত হবে

$ cdrun "$HOME/somedir" ./script.sh

যা স্ক্রিপ্ট চালানো হবে script.shডিরেক্টরিতে অবস্থিত $HOME/somedirসঙ্গে, $HOME/somedirপরিশ্রমী ডিরেক্টরি, বা

$ cdrun / ls -l

যা আপনাকে মূল ডিরেক্টরিটির "দীর্ঘ ফর্ম্যাট" এ ডিরেক্টরি তালিকা সরবরাহ করবে।

শেল ফাংশনটি তার প্রথম যুক্তি নেয় এবং সেই ডিরেক্টরিতে পরিবর্তনের চেষ্টা করে। যদি এটি কাজ করে তবে এটি ডিরেক্টরি নামটি অবস্থানগত প্যারামিটারগুলি (কমান্ড লাইন আর্গুমেন্ট তালিকা) থেকে সরিয়ে দেয় এবং বাকি আর্গুমেন্টের দ্বারা প্রদত্ত কমান্ডটি কার্যকর করে। commandশেলের একটি অন্তর্নির্মিত কমান্ড যা কমান্ড হিসাবে তার যুক্তিগুলি কেবল কার্যকর করে।


আপনি যদি একটি পরিবর্তিত ওয়ার্কিং ডিরেক্টরি সহ একটি কমান্ড চালাতে চান তবে এই সমস্ত প্রয়োজন । আপনি যদি কেবল অন্য কোথাও অবস্থিত একটি কমান্ড চালাতে চান তবে আপনি অবশ্যই ব্যবহার করতে পারেন

alias thing='$HOME/somedir/script.sh'

কিন্তু এই চালানো হবে script.shঅবস্থিত $HOME/somedirসঙ্গে বর্তমান পরিশ্রমী ডিরেক্টরি যেমন ডিরেক্টরি।

কার্যনির্বাহী ডিরেক্টরি পরিবর্তন না করে অন্য কোথাও অবস্থিত স্ক্রিপ্ট কার্যকর করার আরেকটি উপায় হ'ল স্ক্রিপ্টের অবস্থানটি আপনার PATHপরিবেশ পরিবর্তনশীলে যুক্ত করা, যেমন

PATH="$PATH:$HOME/somedir"

এখন script.shমধ্যে $HOME/somedirমাত্র ব্যবহার করে যেকোনো স্থান থেকে চালানো যাবে সক্ষম হবে

$ script.sh

আবার এটি কমান্ডের জন্য ওয়ার্কিং ডিরেক্টরি পরিবর্তন করে না


2
দুর্দান্ত, বিস্তৃত উত্তর। আমি শুধু ভেবেছিলাম আমি উল্লেখ করতে চাই যে ফাংশন সংজ্ঞা শুধুমাত্র কমান্ড গোষ্ঠীবদ্ধ করার একটি পদ্ধতি হল প্রয়োজন subshell জন্য প্রথম বন্ধনী যথেষ্ট আছেন: cdrun () ( cd "$1" && shift && command "$@" )
অ্যান্টনি জি - মনিকার পক্ষে ন্যায়বিচার

2
@ অ্যান্থনি জিওগেইগান আহ, এটা সত্য। { ... }যদিও আমি সবসময় লম্বা ফাংশনগুলির সাথে ধারাবাহিকতার জন্য ব্যবহার করি ।
কুসালানন্দ

এই প্রশ্নোত্তরটি আমার পরিস্থিতি সম্পর্কে কথা বলে মনে হচ্ছে, এবং প্রসঙ্গটি পরিষ্কার রাখার পাশাপাশি আশেপাশের pushdএবং popd( > /dev/nullআপনি যদি আউটপুট বার্তাগুলিও এড়াতে চাইছেন) ব্যবহার করার ক্ষেত্রে উন্নতি হতে পারে !
পিসিস

1
@Pysis হ্যাঁ, (cd dir && thing)অনেক ব্যবহার করে বেশি পোর্টেবল pushdএবং popd
কুসালানন্দ

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

4
alias <name-of-the-alias>='cd <the-directory> && <command>'

সুতরাং, আপনি যদি ডিরেক্টরি (সিডি) ফোল্ডারে পরিবর্তন করতে চান /var/log/এবং তার ফাইলগুলির তালিকা (এলএস) করতে চান তবে আপনি .bash_profileনিম্নলিখিত ফাইলটিতে যুক্ত করতে পারেন :

alias logs='cd /var/log/ && ls'

1

আমি এই ফাংশনটি একটি ভিন্ন ডিরেক্টরিতে একক কমান্ড চালাতে ব্যবহার করি:

cd1 () {
  if [ $# -eq 1 ]; then
    command cd -- "$1"
  else
    ( command cd -- "$1" && shift && "$@" )
  fi
}

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

এই ফাংশনটি সাধারণের মতো কাজ করে cdযদি একক যুক্তি দিয়ে ডাকা হয়, তাই আপনি এটি কল করতে চাইতে পারেন cd। (এই ফাংশনটি কোনও বিকল্পকে সমর্থন করে না, তবে বিকল্পগুলি cdখুব কম ব্যবহৃত হয়))


-1

সেমিকোলনের সাথে পৃথক পৃথক কমান্ড, যেমন:

alias do_something='cd /tmp; ls'

8
যদি cdব্যর্থ হয়, আপনি ভুল ডিরেক্টরি ডিরেক্টরি ডিরেক্টরি পাবেন। এখানে &&পরিবর্তে ব্যবহার করা ভাল ;
কুসালানন্দ

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