सवाल बैश में किसी अन्य निर्देशिका से कमांड निष्पादित करें


कहो कि मैं यह कर रहा हूँ:

cd subdir
git init
cd ../

क्या वहां कमांड चलाने के लिए निर्देशिका में स्थानांतरित करने और बाहर जाने के बजाय, एक कमांड, या शायद दो के साथ ऐसा करने का कोई तरीका है?

(एक गिट-विशिष्ट समाधान की तलाश नहीं है; यह सिर्फ एक उदाहरण है।)


97
2018-04-17 16:05


मूल




जवाब:


यह अक्सर सबसे अच्छा तरीका है:

( cd dir ; git init )

या

( cd dir && git init )

यह बहुत छोटा और टाइप करने में आसान है। यह उप-खोल शुरू करता है, इसलिए आप इससे अपने पर्यावरण को संशोधित नहीं कर सकते हैं, लेकिन यह यहां कोई समस्या नहीं प्रतीत होता है।


170
2018-04-17 16:27



और यदि आपको पर्यावरण चर या दो सेट करने की आवश्यकता है, तो बस शुरुआत में इसे एक और कमांड के रूप में जोड़ें। - Hippo
@CraigMcQueen: वास्तव में नहीं। $? उपशीर्षक में चलाए गए अंतिम आदेश का निकास कोड शामिल होगा। यदि आप इसका उपयोग करते हैं && वेरिएंट (जिसे आप आमतौर पर करना चाहिए), तो आपको पहले कमांड का एक्ज़िट कोड मिलेगा जो असफल रहा (या 0 अगर सब ठीक हो गया)। - Mat
मुझे लगता है कि कोष्ठक वैकल्पिक हैं - Francis.Beauchamp
@ फ्रांसिस.बौचैम्प: यदि आप माता-पिता को छोड़ देते हैं, तो आप शुरू करने के बजाए आदेश के बाद उपदीर में होंगे। - Mat


मैं पथ से गिट कमांड निष्पादित करने का तरीका ढूंढ रहा था, और एक अलग पथ में भंडार में परिवर्तन कर रहा था। तो मैं यहां इस सवाल में समाप्त हुआ।

लेकिन मेरी विशिष्ट जरूरतों के लिए न तो स्वीकृत उत्तर और न ही किसी अन्य ने मदद की।

मुझे गिट कमांड का उपयोग करने की आवश्यकता थी sudo -u USER /usr/bin/git (एक और उपयोगकर्ता इसे चला रहा है)। और जैसा कि आप जानते हैं, सुडो मुझे चलाने की अनुमति नहीं देता है cd आदेश, तो मैं नहीं कर सकता होना भंडार निर्देशिका में।

तो, मैं गया था गिट के मैन पेज। और विकल्पों में से, मैंने देखा --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 फ़ोल्डर के तहत भंडार को init करना चाहते हैं, तो आपको इसे एक साथ निर्दिष्ट करने की आवश्यकता होगी --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 पर्यावरण परिवर्तक और core.worktree कॉन्फ़िगरेशन चर सेट करके नियंत्रित किया जा सकता है (अधिक विस्तृत चर्चा के लिए git-config (1) में core.worktree देखें)।

तो, किसी अन्य उपयोगकर्ता के रूप में गिट चलाने के लिए सही आदेश, और एक नया भंडार प्रारंभ करना है:

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

21
2018-06-20 23:56



यदि आप सूडो का उपयोग कर रहे हैं और स्क्रिप्ट के माध्यम से नहीं, तो आप बस कर सकते हैं sudo -i या sudo su एक इंटरैक्टिव रूट खोल प्राप्त करने के लिए। - Bugster


बिल्कुल नहीं जो आप पूछ रहे हैं (आपके पास सबहेल के साथ वास्तविक उत्तर हैं) लेकिन देखें pushd तथा popd


12
2018-04-17 17:39



मैंने md के लिए cd && के साथ प्रयास किया और यह काम नहीं किया, लेकिन pushd और popd पूरी तरह से काम करता है। धन्यवाद - Radu Toader


आपके पास कुछ विकल्प हैं। आप या तो कमांड को समूहबद्ध कर सकते हैं && या ;। ऐशे ही:

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 init में subdir1, subdir2, तथा subdir3


5
2018-04-17 16:17



धन्यवाद। मुझे पता था && तथा ;, लेकिन कुछ और सुरुचिपूर्ण के लिए उम्मीद की। एक स्क्रिप्ट लिखने की तरह लगता है मेरा सबसे अच्छा विकल्प है। - Trevor Burnham
सुधार: यह जवाब ठीक है, लेकिन मेरी विशेष जरूरतों के लिए मैट का जवाब बेहतर है। - Trevor Burnham


के मामले में git (कम से कम संस्करण 2.7.0 में), आप इसका लाभ उठा सकते हैं -C विकल्प जो गिट व्यवहार करता है जैसे कि यह दी गई निर्देशिका में शुरू किया गया था। तो आपका समाधान इस तरह दिख सकता है:

> 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. 

5
2018-02-19 15:14





आप कमांड को &&, यानी के साथ समूहित कर सकते हैं।

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

यदि आप प्रत्येक कमांड के निकास कोड पर कोई निर्भरता नहीं चाहते हैं, तो आप इसका उपयोग कर सकते हैं; इसके बजाए, i.e .:

cd subdir ; git init ; cd ../

2
2018-04-17 16:09



या साथ ; ताकि वे पिछले के रिटर्न कोड पर निर्भर न हों। - slhck


यदि आपके पास फ़ाइल नाम या निर्देशिका नाम पैरामीटर नहीं है तो आपको अपनी लक्ष्य-निर्देशिका में भाग लेना होगा।

लेकिन आप एक बैश स्क्रिप्ट लिख सकते हैं जो लक्ष्य निर्देशिका और पैरामीटर के रूप में कमांड लेता है। इसके लिए आप pushd और popd पर एक नज़र डाल सकते हैं: http://ss64.com/bash/pushd.html

मैं आपके लिए उस छोटी सी लिपि लिखूंगा, लेकिन मेरे पास लिनक्स बॉक्स नहीं है :)


2
2018-04-17 16:18



बस मार्क Szymanski से जवाब देखा। आप केवल एक कमांड के लिए दूसरा पैरामीटर लागू कर सकते हैं (और कमांड का नाम बदलें) और आपके पास वही है जो आप चाहते हैं। - wullxz