एक निर्देशिका में सीडी के लिए उपनाम और एक कमांड कॉल करें


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
उत्कृष्ट, व्यापक उत्तर। मैंने सोचा था कि मैं उल्लेख करूंगा कि फ़ंक्शन परिभाषा को केवल एक आदेश समूह की आवश्यकता है और उपधारा के लिए कोष्ठक पर्याप्त हैं cdrun () ( cd "$1" && shift && command "$@" ):।
एंथनी जी - मोनिका के लिए न्याय

2
@AnthonyGeoghegan आह, यह सच है। मैं हमेशा { ... }लंबे कार्यों के साथ स्थिरता के लिए उपयोग करता हूं ।
Kusalananda

यह क्यू एंड ए मेरी स्थिति की बात करता है, और आसपास के pushdऔर popd( भले > /dev/nullही आप आउटपुट संदेशों से बचने की कोशिश कर रहे हैं) का उपयोग करके सुधार हो सकता है , जबकि संदर्भ को भी साफ रखते हुए!
पिसिस

1
@ पाउंड हां, (cd dir && thing)उपयोग करने की तुलना में बहुत अधिक पोर्टेबल है pushdऔर popd
Kusalananda

@ कुसलानंद सच में? मैंने उन्हें कम से कम कई प्रणालियों के लिए काम किया है।
पिसिस

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

इसलिए, यदि आप निर्देशिका (सीडी) को फ़ोल्डर में बदलना चाहते हैं /var/log/और फिर इसकी फ़ाइलों को सूचीबद्ध करें (ls) तो आप अपनी .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विफल रहता है, तो आपको गलत निर्देशिका की निर्देशिका सूची मिल जाएगी। यहां के &&बजाय उपयोग करना बेहतर ;है।
Kusalananda

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