বাশ-এ অন্য ডিরেক্টরি থেকে একটি কমান্ড কার্যকর করুন


119

বলুন যে আমি এটি করছি:

cd subdir
git init
cd ../

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

(গিট-নির্দিষ্ট সমাধানের সন্ধান করছেন না; এটি কেবল একটি উদাহরণ))

উত্তর:


202

এটি প্রায়শই সেরা উপায়:

( cd dir ; git init )

অথবা

( cd dir && git init )

এটি বেশ সংক্ষিপ্ত এবং টাইপ করা সহজ। এটি একটি উপ-শেল শুরু করে, সুতরাং আপনি সেখান থেকে আপনার পরিবেশ পরিবর্তন করতে পারবেন না, তবে এটি এখানে কোনও সমস্যা বলে মনে হয় না।


1
এবং যদি আপনার পরিবেশের পরিবর্তনশীল বা দুটি সেট করতে হয় তবে শুরুতে এটি অন্য কমান্ড হিসাবে যুক্ত করুন।
হিপ্পো

1
@ ক্রেইগএমকিউইন: আসলেই না। $?সর্বশেষ কমান্ডের প্রস্থান কোডটি সাব-শেলের মধ্যে চলবে। আপনি যদি &&ভেরিয়েন্টটি ব্যবহার করেন (যা আপনার সাধারণত হওয়া উচিত) তবে আপনি প্রথম কমান্ডের প্রস্থান কোড পাবেন যা ব্যর্থ হয়েছে (বা 0 ঠিক আছে যদি 0)।
মাদুর

আমি মনে করি প্রথম বন্ধনীগুলি
alচ্ছিক

10
@ ফ্রান্সিস.বিউচ্যাম্প: আপনি প্যারেনগুলি বাদ দিলে আপনি যেখানে শুরু করেছিলেন তার চেয়ে কমান্ডের পরে সাবডিরে থাকবেন।
মাদুর

উইন্ডোজে কেউ কীভাবে এটি করতে পারে?
কার্ল মরিসন

22

আমি কোনও পাথ থেকে গিট কমান্ড কার্যকর করার একটি উপায় খুঁজছিলাম, এবং একটি পৃথক পথে সংগ্রহস্থলটিতে পরিবর্তন আনতে চাই। সুতরাং আমি এখানে এই প্রশ্ন শেষ।

তবে আমার নির্দিষ্ট প্রয়োজনের জন্য গ্রহণযোগ্য উত্তর বা অন্য কোনওরই সাহায্য করেনি।

আমার গিট কমান্ডগুলি ব্যবহার করে চালানো দরকার sudo -u USER /usr/bin/git(এটি ব্যবহার করা অন্য একজন ব্যবহারকারী)। এবং আপনি জানেন যে, sudo আমাকে cdকমান্ড চালানোর অনুমতি দেয় না , তাই আমি সংগ্রহস্থল ডিরেক্টরিতে থাকতে পারি না ।

তাই, আমি গিয়েছিলাম Git এর man পৃষ্ঠা । এবং বিকল্পগুলির মধ্যে, আমি দেখেছি --git-dir=<path>:

--git-Dir =

সংগ্রহস্থলের পথ নির্ধারণ করুন। এটি GIT_DIR এনভায়রনমেন্ট ভেরিয়েবল সেট করেও নিয়ন্ত্রণ করা যায়। এটি একটি বর্তমান পথ বা বর্তমান ওয়ার্কিং ডিরেক্টরি সম্পর্কিত আপেক্ষিক পাথ হতে পারে।

সুতরাং, যদি এটি কাউকে সহায়তা করে, আপনি এখনও কোনও পথ থেকে গিট ব্যবহার করতে পারেন এবং "আপনার থেকে দূরে" কোনও সংগ্রহস্থলটিতে পরিবর্তন করতে পারেন। শুধু ব্যবহার করুন:

git --git-dir=/path/to/repository GIT_COMMAND

বা, এটি অন্য ব্যবহারকারী হিসাবে চালানোর জন্য, এর মতো কিছু করুন:

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository GIT_COMMAND

গিট-ইন-এর ম্যান পৃষ্ঠা থেকেও :

যদি $ GIT_DIR এনভায়রনমেন্ট ভেরিয়েবল সেট করা থাকে তবে এটি সংগ্রহস্থলের বেসের জন্য ./.git পরিবর্তে ব্যবহারের জন্য একটি পাথ নির্দিষ্ট করে।

সুতরাং, যদি আপনি সাধারণ .git ফোল্ডারের অধীনে সংগ্রহস্থলটি শুরু করতে চান তবে আপনাকে --git-dirবিকল্পটির সাথে এটি একসাথে নির্দিষ্ট করতে হবে । উদাহরণ:

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init

সংগ্রহস্থলটি আরম্ভ করার পরে /path/to/repo/.git, --work-tree=<path>গিটের ম্যান পৃষ্ঠাতে বর্ণিত সমস্ত কমান্ডের বিকল্প থাকতে হবে :

--work-ট্রি =

কাজের গাছের পথ নির্ধারণ করুন। এটি একটি চলমান ডিরেক্টরি বা বর্তমান ওয়ার্কিং ডিরেক্টরি সম্পর্কিত একটি পাথ হতে পারে। এটি GIT_WORK_TREE এনভায়রনমেন্ট ভেরিয়েবল এবং কোর. ওয়ার্ক্রি ট্রি কনফিগারেশন ভেরিয়েবল সেট করেও নিয়ন্ত্রণ করা যেতে পারে (আরও বিস্তারিত আলোচনার জন্য git-config (1) এ কোর.ওয়ার্কট্রি দেখুন)।

সুতরাং, অন্য ব্যবহারকারী হিসাবে গিট চালানোর জন্য ডান কমান্ড, এবং একটি নতুন সংগ্রহশালা আরম্ভ করার জন্য:

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' add /path/to/repository/*
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' commit -m 'MESSAGE'
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' remote add origin user@domain.com:path
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' push -u origin master

আপনি যদি সুডো ইন্টারেক্টিভভাবে ব্যবহার করছেন এবং কোনও স্ক্রিপ্টের মাধ্যমে নয়, আপনি কেবল ইন্টারেক্টিভ রুট শেলটি পেতে sudo -iবা sudo suকরতে পারবেন।
বুগস্টার

কেন ( cd subdir && sudo -u USER /usr/bin/git init )কাজ করবে না ভাবতে পারি না।
স্কট

আমার অ্যাক্সেস করার অনুমতি না থাকলে কী হবে subdir?
ডিএমএমডি

13

আপনি যা জিজ্ঞাসা করছেন ঠিক তা নয় (আপনার কাছে সাবসেলের সাথে উপরের উত্তর রয়েছে) তবে দেখুন pushdএবংpopd


আমি সিভেন অ্যান্ড অ্যান্ড অ্যান্ড অ্যান্ড মেভেনের জন্য চেষ্টা করেছি এবং এটি কার্যকর হয়নি, তবে পুশড এবং পপড কাজটি পুরোপুরিভাবে করে। ধন্যবাদ
রাদু টডার

6

আপনার স্বল্প কিছু সু্যোগ আছে। আপনি কমান্ডগুলি সাথে &&বা এর সাথে গ্রুপ করতে পারেন ;। এটার মত:

cd subdir && git init && cd ..

অথবা

cd subdir; git init; cd ..

এইগুলির মধ্যে পার্থক্য হ'ল প্রথম উদাহরণে, যদি কোনও কমান্ড ব্যর্থ হয়, তবে এটি বাকীটি কার্যকর করে না। দ্বিতীয় উদাহরণে, সমস্ত কমান্ডই চলবে কোনও কারণই নয়।

অন্য বিকল্পটি হ'ল কোনও ফাংশন সংজ্ঞায়িত করা এবং এটি ব্যবহার করা, উদাহরণস্বরূপ:

function cdinit() {
    cd $1
    git init
    cd ..
}

তারপরে আপনি কমান্ডটি চালাতে পারেন:

cdinit subdir

এবং এটি স্বয়ংক্রিয়ভাবে git initসেই ডিরেক্টরিতে চলে আসবে এবং এ থেকে সরে যাবে।

আপনি যদি একটি ডিরেক্টরি ব্যবহার করেন এবং git initএকটি কমান্ড দিয়ে তাদের কাছে চান তবে আপনি একটি ফাংশন ব্যবহার করে আরও জটিল সমাধান করতে পারেন ।

function cdinit() {
    for arg in $@
    do
        cd $arg
        git init
        cd ..
    done
}

এরপরে আপনি এটি দিয়ে চালাতে পারেন:

cdinit subdir1 subdir2 subdir3

আর এটা করতে হবে git initsubdir1, subdir2এবং subdir3


ধন্যবাদ। আমি সচেতন ছিলাম &&এবং ;, তবে আরও মার্জিত কিছু আশা করি। স্ক্রিপ্ট লেখার মতো শোনানো আমার সেরা বিকল্প।
ট্রেভর বার্নহ্যাম

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

আপনি কি মনে করেন যে আপনার cdinitফাংশনটি স্বেচ্ছাসেবক আদেশগুলির জন্য সাধারণীকরণ করা যেতে পারে? আমি কেবল যুক্তি ব্যবহার করার চেষ্টা করেছি, কিন্তু এটি কার্যকর হয়নি।
চেতন ভাসিন

(1) নিউলাইন সমতুল্য ;, যাতে তিন-লাইন ফাংশন সমান cd $1; git init; cd ..। (2) আপনি আপনার ভেরিয়েবল উদ্ধৃত করা উচিত: "$1", "$@"এবং "$arg"। অথবা আপনি সংক্ষেপে বলতে for arg in "$@"পারেন for arg
স্কট

5

ক্ষেত্রে git(অন্তত সংস্করণ 2.7.0), তবে আপনি এর সুবিধা গ্রহণার্থে করতে -Cবিকল্প যা Git আচরণ তোলে যেমন যদি এটা দেওয়া ডিরেক্টরির মধ্যে শুরু হয়েছে। সুতরাং আপনার সমাধানটি দেখতে পারে:

> git -C subdir init
Initialized empty Git repository in /some/path/subdir/.git/

ডকুমেন্টেশন উদ্ধৃত:

Run as if git was started in <path> instead of the current working directory. When multiple -C options are given, each subsequent non-absolute -C
<path> is interpreted relative to the preceding -C <path>.

This option affects options that expect path name like --git-dir and --work-tree in that their interpretations of the path names would be made
relative to the working directory caused by the -C option. 

2

আপনি কমান্ডগুলিকে && এর সাথে গ্রুপ করতে পারেন, যেমন

cd subdir && git init && cd ../

আপনি যদি প্রতিটি কমান্ডের প্রস্থান কোডের উপর নির্ভরতা না চান তবে আপনি ব্যবহার করতে পারেন; পরিবর্তে, অর্থাত:

cd subdir ; git init ; cd ../

1
অথবা ;এমনটি যাতে তারা আগের কোডটির রিটার্ন কোডের উপর নির্ভর করে না।
slhck

(1)  cd subdir && git init ; cd ..আসলে সবচেয়ে বোধগম্য হতে পারে। ব্যবহারকারী যদি git initকমান্ডটি চালাতে চান subdir, তবে তারা সম্ভবত বর্তমান ডিরেক্টরিতে কমান্ডটি চালাতে চান না; উদাহরণস্বরূপ, (প্রথম) cdব্যর্থ হলে তারা এটি চালাতে চায় না । (যদিও এটা সম্ভব যে  cdব্যর্থ, কারণ আমরা করছি ইতিমধ্যে মধ্যে subdir, কিন্তু যে একটি কোণায় কেস আছে।) ... (Cont'd)
স্কট

(চালিয়ে যাওয়া) ... তবে, ব্যবহারকারী যদি তিনটি কমান্ডের ব্লকটিকে ইউনিট হিসাবে বিবেচনা করতে চান, তবে তারা কমান্ড ব্যর্থ cdহলেও প্রাথমিক ডিরেক্টরিতে ব্যাক আপ করতে চাইতে পারে  git init। ( অথবা, তারা সাব থাকতে এবং কমান্ড ব্যর্থতা নির্ণয় করতে চাইতে পারেন।) (2) আপনি অন্তর্ভুক্ত করা প্রয়োজন হবে না /পরে  ..
স্কট

2

কমান্ডের কোনও ফাইলের নাম বা ডিরেক্টরি নাম প্যারামিটার না থাকলে আপনাকে আপনার লক্ষ্য-ডিরেক্টরিতে যেতে হবে।

তবে আপনি একটি বাশ স্ক্রিপ্ট লিখতে পারেন যা লক্ষ্য ডিরেক্টরিটি এবং পরামিতি হিসাবে কমান্ড নেয়। এর জন্য আপনি পুশড এবং পপড একবার দেখে নিতে পারেন: http://ss64.com/bash/pushd.html

আমি আপনার জন্য সেই ছোট স্ক্রিপ্ট লিখব, তবে আমার এখানে একটি লিনাক্স বক্স নেই :)


মার্ক সিজিমানস্কির উত্তর সবেমাত্র দেখেছি। আপনি কেবলমাত্র কমান্ডের জন্য একটি দ্বিতীয় প্যারামিটার প্রয়োগ করতে পারেন (এবং কমান্ডটির নাম পরিবর্তন করে) এবং আপনি যা চান তা আপনার কাছে রয়েছে।
wulxz

1

প্রোগ্রামগুলিতে আর্গুমেন্টগুলি পরিচালনা করার বিভিন্ন উপায় রয়েছে, সুতরাং কয়েকটিটিতে ফোল্ডার = নামের বিকল্পের কিছু সমতুল্য থাকবে । যে ব্যতিক্রম অতিক্রম, স্ট্যান্ডার্ড, এমনকি এমএস ডস, সহজ

$ প্রোগ্রাম সাবডির

কখনও কখনও আপনার প্রয়োজন

$ প্রোগ্রাম সাবডির /

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

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

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