किसी अन्य निर्देशिका से bash में एक कमांड निष्पादित करें


119

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

cd subdir
git init
cd ../

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

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

जवाबों:


202

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

( cd dir ; git init )

या

( cd dir && git init )

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


1
और अगर आपको एक पर्यावरण चर या दो सेट करने की आवश्यकता है, तो इसे शुरुआत में एक और कमांड के रूप में जोड़ें।
हिप्पो

1
@ क्रैगमच्युएन: वास्तव में नहीं। $?उप कमांड में अंतिम कमांड का निकास कोड होगा। यदि आप &&वैरिएंट का उपयोग करते हैं (जो आपको आमतौर पर करना चाहिए), तो आपको पहले कमांड का एग्जिट कोड मिलेगा जो विफल रहा (या यदि सब ठीक है तो 0)।
Mat

मुझे लगता है कि कोष्ठक वैकल्पिक हैं
फ्रांसिस.बियूकैम्प

10
@ Francis.Beauchamp: यदि आप पराने को छोड़ देते हैं, तो आप वापस शुरू करने के बजाय कमांड के बाद अधीन में होंगे।
मैट

विंडोज पर कोई ऐसा कैसे करता है?
कार्ल मॉरिसन

22

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

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

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

तो, मैं git के मैन पेज पर गया । और विकल्पों में से, मैंने देखा --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-init के आदमी पेज :

यदि $ 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>, जैसा कि git के मैन पेज पर वर्णित है:

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

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

मैं सोच भी नहीं सकता कि ( cd subdir && sudo -u USER /usr/bin/git init )काम क्यों नहीं करेगा।
स्कॉट

अगर मुझे एक्सेस करने की अनुमति नहीं है तो क्या होगा subdir?
dmmd

13

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


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

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 initमें subdir1, subdir2, और subdir3


धन्यवाद। मैं जानता था &&और ;, लेकिन कुछ और सुरुचिपूर्ण के लिए आशा व्यक्त की। स्क्रिप्ट लिखने की तरह लगता है मेरा सबसे अच्छा विकल्प है।
ट्रेवर बर्नहैम

सुधार: यह उत्तर ठीक है, लेकिन मेरी विशेष आवश्यकताओं के लिए मैट का उत्तर बेहतर है।
ट्रेवर बर्नहैम

क्या आपको लगता है कि cdinitमनमाने आदेशों के लिए आपके कार्य को सामान्यीकृत किया जा सकता है? मैंने सिर्फ तर्कों का उपयोग करने की कोशिश की, लेकिन यह काम नहीं किया।
चेतन भसीन

(1) न्यूलाइन के बराबर है ;, ताकि तीन-लाइन फ़ंक्शन के बराबर हो cd $1; git init; cd ..। (2) आप अपने चर बोली चाहिए: "$1", "$@"और "$arg"। या फिर आप को संक्षिप्त कर सकते हैं for arg in "$@"करने के लिए for arg
स्कॉट

5

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. 

2

आप आदेशों को &&, यानी के साथ समूहीकृत कर सकते हैं

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

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

cd subdir ; git init ; cd ../

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

(१)  cd subdir && git init ; cd ..वास्तव में सबसे अधिक समझदारी हो सकती है। यदि उपयोगकर्ता git initकमांड चलाना चाहता है subdir, तो वे संभवतः वर्तमान निर्देशिका में कमांड चलाना नहीं चाहते हैं; यदि वे (पहले) cdविफल होते हैं, तो वे इसे चलाना नहीं चाहते हैं । (यद्यपि यह संभव है कि  cdहम पहले से ही असफल हों subdir, लेकिन यह एक कोने का मामला है।)… (Cont'd)
स्कॉट

(जारी) ... हालांकि, उपयोगकर्ता एक इकाई के रूप में तीन आदेशों की ब्लॉक के इलाज के लिए चाहता है, वे करने के लिए चाहते हो सकता है  cdशुरू करने निर्देशिका भले ही करने के लिए बैकअप लेने के git initआदेश विफल रहता है। ( या, वे उपनिर्देशिका में रहना चाहते हैं और कमांड विफलता का निदान कर सकते हैं।) (2) आपको /बाद  में शामिल करने की आवश्यकता नहीं है ..
स्कॉट

2

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

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

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


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

1

कार्यक्रमों में तर्कों को संभालने के अलग-अलग तरीके हैं, इसलिए कुछ में कुछ समतुल्य- फ़ोल्डर = नाम विकल्प होगा। उस अपवाद से परे, एमएस डॉस पर भी मानक, बस है

$ कार्यक्रम उप

कभी-कभी आपकी जरूरत होती है

$ कार्यक्रम उपखंड /

कार्यक्रम फ़ोल्डर को खोलेगा, इसके साथ उसी तरह काम करें जैसे आप एक फ़ाइल के साथ काम करते हैं, और एक बार समाप्त होने के बाद, अपने शेल पर नियंत्रण लौटाएं, जो आपके मूल मानक निर्देशिका में बताया गया है। प्रोग्राम्स ने इस तरह से संभाला है कि क्या समस्या है कि त्रुटि आउटपुट (जैसे कोर डंप) आपके शेल की वर्तमान निर्देशिका में फ़ाइल में जाते हैं ( उपखंड के बजाय )।

जब तक प्रोग्राम में भिन्न स्थान निर्दिष्ट करने के लिए कमांड स्विच उपलब्ध नहीं है तब तक कोई वर्कअराउंड नहीं है। कुछ प्रोग्रामर "निर्देशिका प्रोग्राम से बुलाया गया था " और "निर्देशिका प्रोग्राम को काम करने के लिए कहा गया था" के बीच कलात्मक लाइसेंस लेते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.