আমি কীভাবে নিজের "শেল কমান্ড" তৈরি করতে পারি (উদাঃ mkdir / cd কম্বো)?


41

আমি কমান্ডের জন্য কতবার ইচ্ছা চেয়েছি তা বলতে পারি না যা উভয়ই ডিরেক্টরি তৈরি করে সেই ডিরেক্টরিতে চলে যেতে পারে। মূলত, আমি নিম্নলিখিতগুলির সমতুল্য চাই:

mkdir -p /arbitrarily/long/path; cd /arbitrarily/long/path

তবে কেবল /arbitrarily/long/pathএকবার টাইপ করতে হবে , এরকম কিছু:

mk-cd /arbitrarily/long/path

আমি এটি করার জন্য একটি স্ক্রিপ্ট তৈরি করার চেষ্টা করেছি, তবে এটি কেবল স্ক্রিপ্টের মধ্যে ডিরেক্টরি পরিবর্তন করে। আমি শেলের ডিরেক্টরিটিও পরিবর্তন করতে চাই।

#!/bin/bash
mkdir $1
cd $1
export PWD=$PWD

আমি কীভাবে এই কাজটি করতে সক্ষম হব?


12
এর সাথে cd, আপনি শুরু থেকেই একটি বিশেষ কেস বেছে নিয়েছেন। : ডি
ড্যানিয়েল বি

2
ঠিক আমি যা খুঁজছিলাম তা নয়, তবে দুর্দান্ত শীতল- cdসম্পর্কিত তথ্য (ডিরেক্টরিগুলির "স্ট্যাক" cd -ব্যবহার করে pushdএবং ব্যবহার করতে পূর্ববর্তী ডিরেক্টরিতে ফিরে যান popd): superuser.com/questions/324512/…
ক্রিস্টোফার বটমস

8
আপনি টাইপ করতে পারেন mkdir -p /very/long/path, তারপরে cd, স্পেসটি টাইপ করতে পারেন , এবং তারপরে Alt + টিপতে .সর্বশেষ যুক্তিটি, অর্থাৎ দির নামটির পুনরাবৃত্তি করতে পারেন।
ছোড়োবা

2
উত্তর নয়, @ চোরোবার মতো একটি মন্তব্য: আপনি এটি ব্যবহার করতে পারেন mkdir -p /very/long/path; cd !#:2। স্ট্রিংটি !#:2আর্গুমেন্ট এনআর তে প্রসারিত হবে। 2 (এটি তৃতীয় যুক্তি /very/long/path, যেমন শূন্য দিয়ে গণনা শুরু হয়)।
ইনগো ব্লিচমিমিট

3
@IngoBlechschmidt, আরও সহজ, যেহেতু এটি গত কমান্ডের গত যুক্তি, আপনি শুধু ব্যবহার করতে পারেন !$। আমি এই বিশেষ কৌশলটি সর্বদা ব্যবহার করি, যদিও ইতিহাসের প্রসার নিয়ে আপনি আরও অনেক কিছু করতে পারেন
ওয়াইল্ডকার্ড

উত্তর:


92

সবচেয়ে সহজ উপায় শেল ফাংশন ব্যবহার করা:

mkcd() {
    mkdir -p -- "$1" && cd -- "$1"
}

এটি .bashrcঅন্য শেল কমান্ডের মতো আপনার কাছে উপলব্ধ হওয়ার জন্য এটিকে আপনার ফাইলে রাখুন ।

এটি বাহ্যিক স্ক্রিপ্ট হিসাবে কাজ না করার কারণটি হ'ল cdচলমান স্ক্রিপ্টের বর্তমান ডিরেক্টরি পরিবর্তন করে তবে কলিংটিকে প্রভাবিত করে না। এটি ডিজাইনের মাধ্যমে! প্রতিটি প্রক্রিয়াটির নিজস্ব ওয়ার্কিং ডিরেক্টরি রয়েছে যা তার সন্তানদের দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত, তবে বিপরীতটি সম্ভব নয়।

পাইপলাইনের অংশ ব্যতীত, ব্যাকগ্রাউন্ডে বা স্পষ্টভাবে একটি সাবশেলে চালানো না করে, শেল ফাংশন পৃথক প্রক্রিয়াতে চলতে পারে না তবে একই ক্ষেত্রে যেমন কমান্ডটি উত্সাহিত হয়েছে। বর্তমান ডিরেক্টরি শেল একটি ফাংশন দ্বারা পরিবর্তন করা যেতে পারে।

&&এখানে ব্যবহৃত ব্যবহৃত মাধ্যম উভয় কমান্ড আলাদা করতে, যদি প্রথম কমান্ড সফল ( mkdir), দ্বিতীয় চালানো ( cd)। ফলস্বরূপ, যদি mkdirঅনুরোধ করা ডিরেক্টরিটি তৈরি করতে ব্যর্থ হয় তবে এটিতে যাওয়ার চেষ্টা করার কোনও মানে নেই। একটি ত্রুটি বার্তা দ্বারা মুদ্রিত হয় mkdirএবং এটি।

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

mkcd() {
    if [ -d "$1" ]; then
        printf "mkcd: warning, \"%s\" already exists\n" "$1"
    else
        mkdir -p "$1" 
    fi && cd "$1"
}

ছাড়া -pবিকল্প, প্রাথমিক ফাংশন আচরণ ভিন্ন হত।

ডিরেক্টরিটি তৈরি করতে ডিরেক্টরিটি যদি ইতিমধ্যে উপস্থিত না mkdirথাকে তবে ফাংশনটি ব্যর্থ হয়।

যদি তৈরি করা ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান থাকে তবে mkdirখুব ব্যর্থ হয় এবং কল cdহয় না।

পরিশেষে, নোট করুন যে সেটিংস / রফতানি PWDঅর্থহীন, কারণ শেলটি ইতিমধ্যে এটি অভ্যন্তরীণভাবে করেছে।

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


5
আপনার আরও যোগ করা উচিত যে এই কমান্ডটি ~/.bashrcঅন্য কোনও আরম্ভের স্ক্রিপ্টগুলিতে যুক্ত না করা হলে স্থায়ীভাবে উপলব্ধ হবে না ।
এএফএইচ

কোন alias mk-cd 'mkdir -p \!:1; cd \!:1'ফাংশন ছাড়া tsh এর সমতুল্য করার বাশ করার কোনও উপায় নেই ? বা সম্ভবত আমার আরও বাড়ানো এলিয়াসগুলির মতো ব্যাশ ফাংশনগুলি চিন্তা করা শুরু করা উচিত?
টমাস প্যাড্রন-ম্যাকার্থি

@ থমাস প্যাড্রন-ম্যাকার্থি এই cshযুক্তিটি উত্তীর্ণ করার পদ্ধতিটি বোর্ন স্টাইলের উপমা দিয়ে প্রয়োগ করা হয়নি। ফাংশনগুলি আসলে আরও বেশি নমনীয় হয়ে যাওয়ার উপায়।
jlliagre

@ থমাস প্যাড্রন-ম্যাকার্থি - আপনি এই উত্তরটি দেখতে পছন্দ করতে পারেন , যা একটি উলামের (সংজ্ঞা অনুসারে bar) পাস হওয়া প্যারামিটারগুলিতে অ্যাক্সেসের জন্য একটি বরং গর্ভকালীন প্রক্রিয়া সরবরাহ করে । অন্য বিকল্পটি ব্যবহার করা হবে history 1, যেমন alias mk-cd='args="$(history 1)" && args="${args#*mk-cd\ }" && mkdir -p "$args" && cd'- এটি প্রশ্নকারীর উদাহরণের জন্য সূক্ষ্মভাবে কাজ করে তবে এটি সাধারণ সমাধান নয়, কারণ একই লাইনের অন্য কোনও কমান্ড (যেমন আউটপুটটি পাইপ করা) এটি ব্যর্থ হতে পারে।
এএফএইচ

3
@ থমাস প্যাড্রন-ম্যাকার্থি আপনার সীমাবদ্ধ ফাংশনের মতো টিসিএস-এর এলিয়াসগুলি ভাবতে শুরু করা উচিত।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

32

আমি একটি বিকল্প সমাধান যোগ করতে চাই।

আপনার লিপিটি যদি আপনি আদেশ বা আদেশ দিয়ে আবেদন করেন তবে এটি কাজ করবে :.source

. mk-cd /arbitrarily/long/path

আপনি যদি exportস্ক্রিপ্টটিতে এটি করেন তবে এটি অপ্রয়োজনীয়। আপনি এটি .ব্যবহার করে টাইপ করে বাইপাস করতে পারেন alias:

alias mk-cd='. mk-cd'

এটি কাজ করার কারণটি হ'ল একটি স্ক্রিপ্ট সাধারণত একটি সাব-শেলের মধ্যে চলতে থাকে তাই এর পরিবেশনাটি সম্পূর্ণ হওয়ার পরে হারিয়ে যায় তবে .(বা source) কমান্ড এটিকে বর্তমান শেলটিতে চালিত করতে বাধ্য করে।

এই কৌশলটি কমান্ড সিকোয়েন্সগুলির জন্য দরকারী হতে পারে যা কোনও ফাংশনের জন্য খুব জটিল বা যা বিকাশের অধীনে থাকে এবং প্রায়শই সম্পাদিত হয়: একবার aliasপ্রবেশ করা হয়ে গেলে .bash_aliasesআপনি পুনরায় পুনরায় সংবিধান ছাড়াই স্ক্রিপ্টটি সম্পাদনা করতে পারেন।

নিম্নলিখিত নোট:

আপনি যদি কোনও স্ক্রিপ্ট লিখে থাকেন যা অবশ্যই. / sourceকমান্ডের সাথে কল করা উচিত , এটি নিশ্চিত করার দুটি উপায় রয়েছে: -

  1. কিছু কারণে, একটি স্ক্রিপ্ট সঙ্গে প্রার্থনা ./ sourceএক্সিকিউটেবল প্রয়োজন হবে না, তাই কেবল এই অনুমতি এবং স্ক্রিপ্ট অপসারণ পারেন মধ্যে "$ পথ" পাওয়া যাবে না অথবা যদি একটি সুনির্দিষ্ট পাথ দিয়ে প্রার্থনা একটি অনুমতির ত্রুটি দেব।

  2. বিকল্পভাবে, নিম্নলিখিত কৌশলটি স্ক্রিপ্টের মাথায় ব্যবহার করা যেতে পারে:

bind |& read && { echo 'Must be run from "." or "source" command'; exit 1; }

এটি কাজ করে কারণ একটি সাব-শেলটিতে bindএকটি সতর্কতা জারি করা হয়েছে, তবুও কোনও ত্রুটি স্থিতি: সুতরাং readকোনও ইনপুটটিতে ত্রুটি দেওয়ার জন্য ব্যবহৃত হয়।


তথ্যের জন্য ধন্যবাদ .। আমি . .bashrcঅগণিত সময় করেছি, তবে ঠিক কী .করে তা জানতাম না । এর সাথে কি মিল আছে export?
cst1992

2
@ সিএসটি ১৯৯২ - না, কমান্ডগুলি সম্পূর্ণ আলাদা: পরিবেশের export varঅভ্যন্তরীণ ভেরিয়েবলটি অনুলিপি করে var, যেখানে এটি উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং যে কোনও সাব-শেলের মধ্যে ভেরিয়েবল হিসাবে আমদানি করা হয়, তবে প্যারেন্ট শেলের উপর এর কোনও প্রভাব নেই। সাধারণত একটি স্ক্রিপ্ট চালানোর জন্য একটি উপ-শেল তৈরি করা হয়, এবং এটি সম্পাদিত (রফতানি ভেরিয়েবল সহ) যে কোনও পরিবর্তনগুলি সম্পূর্ণ হয়ে গেলে তা নষ্ট হয়। কোনও শেলটিতে স্ক্রিপ্টটি ভেরিয়েবল সেট করার জন্য সেই শেলটিতে এটি চালাতে হয় এবং .কমান্ডটি এটি করে: একটি সাব-শেল তৈরি না করে স্ক্রিপ্টটি চালান। কৌতূহলজনকভাবে, চালিত স্ক্রিপ্টগুলির কার্যকর .করার অনুমতি প্রয়োজন নেই।
এএফএইচ

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

@ সিএসটি ১৯৯২ - আমি মূল প্রশ্নটি সম্বোধন করেছি, তবে আমি আমার উত্তরটি আনুষঙ্গিক বিষয়গুলিতে ছড়িয়ে দিতে চাই না। আপনি যদি আদেশ .এবং exportআদেশগুলির ব্যাখ্যা খুঁজছেন তবে এই প্রশ্নের শিরোনাম আপনাকে এখানে একটি উত্তর আশা করতে পরিচালিত করবে না, তাই আমি আমার উত্তরটি যেমন স্থির করে দেব তবে আপনার মন্তব্যের জন্য ধন্যবাদ।
এএফএইচ

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

13

একটি কমান্ড নয়, তবে আপনাকে যে সমস্ত পাথ ব্যবহার করবেন সেগুলি পুনরায় টাইপ করতে হবে না !$(এটি শেল ইতিহাসের পূর্ববর্তী কমান্ডের শেষ যুক্তি)।

উদাহরণ:

mkdir -p /arbitrarily/long/path
cd !$

1

এলিয়াস তৈরি করে । আপনার নিজস্ব কমান্ড তৈরি করার খুব জনপ্রিয় উপায়।

আপনি উড়তে একটি উপনাম তৈরি করতে পারেন:

alias myalias='mkdir -p /arbitrarily/long/path; cd /arbitrarily/long/path'

এটাই. আপনি যদি সেই উরফ স্থায়ীভাবে রাখতে চান (কেবল চলতি সেশনটি নয়), তবে সেই কমান্ডটি একটি ডটফাইলে রাখুন (সাধারণত ~ / .bash_aliases বা। / .Bash_profile)।


4
দীর্ঘ ডিরেক্টরি নামটি হার্ডকোডযুক্ত হওয়ায় এই ডিরেক্টরিটি নিয়মিতভাবে অন্য কোনও প্রক্রিয়া দ্বারা ধ্বংস না করা হলে এই উপনামটি খুব কার্যকর হবে না।
jlliagre

1

ইতিমধ্যে যা প্রস্তাবিত হয়েছে তা ছাড়াও, আমি চুরির সুপারিশ করতে চাই । ভুলগুলি স্থির করে আপনার শেল প্রক্রিয়াটি সহজতর করার জন্য এটি একটি পাইথন কাঠামো। এই টুইটটির দ্বারা অনুপ্রাণিত হয়ে আপনাকে যা করতে হবে তা হ'ল আপনার কনফিগার করা ওরফে টাইপ করুন (ডিফল্টরূপে fuck) এবং এটি আপনার পূর্ববর্তী আদেশটি সংশোধন করার চেষ্টা করবে। এর একটি সংশোধন নিম্নরূপ আচরণ করে:

/etc $ cd somedir
bash: cd: No such file or directory
/etc $ fuck
mkdir somedir && cd somedir
/etc/somedir $ 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.