मैं खुद को बहुत दोहरा रहा हूं:
mkdir longtitleproject
cd longtitleproject
क्या निर्देशिका नाम को दोहराए बिना इसे एक पंक्ति में करने का एक तरीका है? मैं यहां बैश पर हूं।
mkdir longtitleproject
तत्पश्चातcd !^
मैं खुद को बहुत दोहरा रहा हूं:
mkdir longtitleproject
cd longtitleproject
क्या निर्देशिका नाम को दोहराए बिना इसे एक पंक्ति में करने का एक तरीका है? मैं यहां बैश पर हूं।
mkdir longtitleproject
तत्पश्चातcd !^
जवाबों:
कोई अंतर्निहित कमांड नहीं है, लेकिन आप आसानी से एक फ़ंक्शन लिख सकते हैं जो mkdir
तब कॉल करता है cd
:
mkcd () {
mkdir "$1"
cd "$1"
}
इस कोड को अपनी ~/.bashrc
फ़ाइल में रखें (या ~/.kshrc
ksh उपयोगकर्ताओं के लिए, या ~/.zshrc
zsh उपयोगकर्ताओं के लिए)। यह एक फ़ंक्शन को परिभाषित करता है जिसे कहा जाता है mkcd
। "$1"
जब आप इसे चलाते हैं, तो फ़ंक्शन के तर्क द्वारा प्रतिस्थापित किया जाएगा।
इस सरल संस्करण में कई दोष हैं:
-p
विकल्प को पास करें mkdir
। (यह वांछनीय हो सकता है या नहीं भी हो सकता है, क्योंकि यह एक टाइपो के अनिर्धारित होने के जोखिम को बढ़ाता है, उदाहरण के mkcd mydierctory/newsub
लिए खुशी से बनायेगा mydierctory
और mydierctory/newsub
जब आप newsub
मौजूदा के अंदर बनाने का मतलब करेंगे mydirectory
।)-
लेकिन सिर्फ नहीं है -
, तो mkdir
और cd
एक विकल्प के रूप में यह व्याख्या करेगा। अगर यह सिर्फ है -
, तो cd
इसका मतलब करने के लिए व्याख्या करेंगे $OLDPWD
। यदि यह +
0 या उससे अधिक अंकों का अनुसरण करता है, तो cd
zsh में इसे निर्देशिका स्टैक में एक सूचकांक के रूप में व्याख्या करेगा। आप पहले समस्या को ठीक कर सकते हैं, लेकिन अन्य दो --
को तर्क से पहले पारित करके नहीं । आप इन सभी समस्याओं ./
को तर्क के बहाने ठीक कर सकते हैं यदि यह एक सापेक्ष पथ है।mkdir
का पालन नहीं करता है CDPATH
, लेकिन cd
अगर आपने CDPATH
एक ऐसे मूल्य पर सेट किया है, जो शुरू नहीं होता है .
(एक सामान्य रूप से कुछ हद तक असामान्य कॉन्फ़िगरेशन), तो cd
आप उसे एक अलग निर्देशिका में ला सकते हैं जो अभी बनाया गया था। Prepending ./
संबंधित पथ को यह ठीक करता है (यह कारण बनता है CDPATH
पर ध्यान नहीं दिया जा करने के लिए)।mkdir
विफल रहता है, तो यह निष्पादित करने का प्रयास करता है cd
। फिक्स: &&
दो कमांड को अलग करने के लिए उपयोग करें।अभी भी काफी सरल:
mkcd () {
case "$1" in /*) :;; *) set -- "./$1";; esac
mkdir -p "$1" && cd "$1"
}
इस संस्करण में अभी भी cd
एक से एक अलग निर्देशिका में जाने की क्षमता है जो mkdir
सिर्फ एक किनारे के मामले में बनाई गई है: यदि तर्क में mkcd
समाहित है ..
और एक प्रतीकात्मक लिंक के माध्यम से जाता है। उदाहरण के लिए, यदि वर्तमान निर्देशिका है /tmp/here
और mylink
एक प्रतीकात्मक लिंक है /somewhere/else
, तो mkdir mylink/../foo
बनाता है /somewhere/else/foo
जबकि में cd mylink/../foo
बदल जाता है foo
। यह तर्क में प्रतीकात्मक लिंक देखने के लिए पर्याप्त नहीं है, क्योंकि शेल अपने स्वयं के वर्तमान निर्देशिका में प्रतीकात्मक लिंक को भी ट्रैक cd /tmp/mylink; mkdir ../foo; cd ../foo
करता है , इसलिए नई निर्देशिका ( /somewhere/else/foo
) में नहीं बदलता है /tmp/foo
। इसके लिए एक फिक्स है कि cd
बिल्टिन को सभी ..
पथ घटकों को पहले हल करने दें ( foo/..
यदि इसका उपयोग करने का कोई मतलब नहीं हैfoo
मौजूद नहीं है, इसलिए mkdir
कभी कोई देखने की जरूरत नहीं है ..
)।
अगर थोड़ा गैरी संस्करण है तो हम इस मजबूत पर आते हैं:
mkcd () {
case "$1" in
*/..|*/../) cd -- "$1";; # that doesn't make any sense unless the directory already exists
/*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";;
/*) mkdir -p "$1" && cd "$1";;
*/../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";;
../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
*) mkdir -p "./$1" && cd "./$1";;
esac
}
(व्यायाम: मैं पहली cd
कॉल के लिए एक उपखंड का उपयोग क्यों कर रहा हूं ?)
अगर mkdir विफल रहता है, तो मैं यह सुनिश्चित करना चाहता हूं कि वर्तमान निर्देशिका को नहीं बदला जाए। यदि cd के पास अपनी वर्तमान निर्देशिका में बदलने की अनुमति नहीं है, तो cd - या $ OLDPWD के साथ वापस बदलना पर्याप्त नहीं है। इसके अलावा, cd अपडेट को OLDPWD कहते हैं, इसलिए हम केवल इसे एक बार करना चाहते हैं (या OLDPWD को पुनर्स्थापित करें)।
पिछली पंक्ति से शब्द को फिर से लिखने के लिए कम विशिष्ट तरीके नहीं हैं:
cd
, फिर Esc .(या Alt+ .)।cd !$
cd
पिछली कमांड के अंतिम तर्क पर अमल करता है ।mkdir
में cd
।ksh
, और यह भी काम करता है zsh
) "पिछले कमांड के अंतिम शब्द को दोहराएं" के लिए अनुक्रम। मैं इसे अक्सर उपयोग करता हूं।
/a/b/..//
वास्तव में काम करेगा, लेकिन नहीं /a/b/../c
। फिक्स्ड। मैंने सवाल को व्यापक दर्शकों के सामने रखा है।
mkcd() { mkdir -p "$1" && cd "$1"; }
(मेरे उदाहरण के) zsh में एक समस्या नहीं लगती है। mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd
(इसमें सेटअप और) डिस्प्ले शामिल हैं /tmp/here/foo
जो कि बनाया गया था (और मुझे उम्मीद थी)। bash
गलत तरीके से बनाता है और बदल जाता है /var/tmp/somewhere/foo
।
यह वन-लाइनर है जिसकी आपको आवश्यकता है। कोई अन्य विन्यास की आवश्यकता:
mkdir longtitleproject && cd $_
$_
चर, बैश में, पिछले आदेश को दिया अंतिम तर्क है। इस स्थिति में, आपके द्वारा बनाई गई निर्देशिका का नाम। जैसा कि समझाया गया है man bash
:
_ At shell startup, set to the absolute pathname used to invoke
the shell or shell script being executed as passed in the envi‐
ronment or argument list. Subsequently, expands to the last
argument to the previous command, after expansion. Also set to
the full pathname used to invoke each command executed and
placed in the environment exported to that command. When check‐
ing mail, this parameter holds the name of the mail file cur‐
rently being checked."$_" is the last argument of the previous command.
cd $_
पिछली कमांड के अंतिम तर्क को पुनः प्राप्त करने के लिए उपयोग करें cd !$
क्योंकि शेल इतिहास मेंcd !$
पिछली कमांड का अंतिम तर्क देता है :
cd ~/
mkdir folder && cd !$
आप घर खत्म (या ~ /)
cd ~/
mkdir newfolder && cd $_
आप घर के नीचे newfolder में अंत !! (या ~ / newfolder)
mkdir foo && cd foo
, जो आसान नहीं है।
इस व्यवहार को लिपिबद्ध करने के लिए मेरे साथ ऐसा कभी नहीं हुआ होगा क्योंकि मैं लगभग एक घंटे के आधार पर निम्नलिखित दर्ज करता हूं ...
$ mkdir someDirectory<ENTER>
$ cd !$
जहां बैश कृपया !$
अंतिम पंक्ति के अंतिम शब्द के साथ स्थानापन्न करें; यानी लंबी निर्देशिका का नाम जो आपने दर्ज किया है।
इसके अलावा, ऐसी परिस्थितियों में फ़ाइल नाम पूरा करना आपका मित्र है। यदि आपकी नई निर्देशिका फ़ोल्डर में एकमात्र फ़ाइल थी तो एक त्वरित डबल TABआपको फिर से दर्ज किए बिना नई निर्देशिका देगा।
यद्यपि यह अच्छा है कि बैश आपको इस तरह के सामान्य कार्यों को स्क्रिप्ट करने की अनुमति देता है क्योंकि अन्य उत्तर बताते हैं कि मुझे लगता है कि कमांड लाइन संपादन सुविधाओं को सीखना बेहतर है जो बैश की पेशकश करना है ताकि जब आप किसी अन्य मशीन पर काम कर रहे हों तो आप वाक्य रचना को याद नहीं कर रहे हैं चीनी जो आपकी कस्टम स्क्रिप्ट प्रदान करती है।
के अनुसार क्या अनुकूलन आप उत्पादकता बढ़ाने के लिए अपने खोल प्रोफ़ाइल पर क्या किया है? , यह मेरा इसे करने का तरीका है:
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
इसका मतलब यह है कि यह भी काम करता है अगर निर्देशिका पहले से मौजूद है।
-p
Mkdir का विकल्प त्रुटियों को दबा देगा।
mcd
कमान क्या है ? कौन सा पैकेज या प्रोजेक्ट इस कमांड को प्रदान करता है?
यदि आप ओह माई ज़ीश का उपयोग करते हैं, तो एक कमांड है जिसे टेक कहा जाता है जो वास्तव में ऐसा करता है। यह कुछ इस तरह दिखेगा।
take myfolder
मुझे वास्तव में यह दुर्घटना से मिला। मैं सिर्फ देखा और उस पर सूचीबद्ध है इस cheatsheat ओह माई Zsh GitHub विकी है। यह काफी उपयोगी कमांड है, और जाहिर तौर पर खुद को बनाने में बहुत आसान है।
take
:) के बारे में कभी नहीं जानता था ! btw - ओह मेरे Zsh के साथ iTerm2। यहाँ वास्तव में 3 सही उत्तर हैं। यह एक, @ jesús-carrera, और चयनित जवाब से एक है। आपके सेटअप और वरीयता पर निर्भर करता है।
यहाँ एक मामूली रूपांतर है जो उल्लेख के योग्य है:
function mkdir() {
local dir=$1
command mkdir "$dir" && cd "$dir"
}
इसे अपने में जोड़ें ~/.bash_profile
और आप mkdir
सामान्य (एक बार जब आप source
इसे ले सकते हैं) के रूप में उपयोग कर सकते हैं, सिवाय अब यह मानक mkdir
कमांड के बजाय फ़ंक्शन को ऊपर चलाएगा ।
ध्यान दें, यह गिल्स द्वारा स्वीकार किए गए उत्तर के अनुसार इनपुट को मान्य नहीं करता है , लेकिन यह दर्शाता है कि आप बिल्डरों को कैसे (प्रभावी रूप से) ओवरराइड कर सकते हैं।
डॉक्स से (थोड़ा सा विरोधाभास):
command mkdir [args]
नामित किसी भी शेल फ़ंक्शनmkdir
कोargs
अनदेखा करने के साथ चलता हैmkdir
। केवल शेल बिल्ट कमांड या PATH की खोज के द्वारा मिलने वाले कमांड निष्पादित होते हैं। यदि कोई शेल फ़ंक्शन हैls
,command ls
तो फ़ंक्शन के भीतर चल रहा है, फ़ंक्शन कोls
पुनरावर्ती रूप से कॉल करने के बजाय बाहरी कमांड निष्पादित करेगा
मेरा मानना है कि builtin
एक समान परिणाम प्राप्त होता है command
।
$dir
command
एक विकल्प के रूप में उपयोग प्रस्तुत कर रहा हूं ।
mkcd
एक पंक्ति में अपने वातावरण के लिए कमांड बनाएँ
echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc
मैंने एक स्क्रिप्ट बनाई जो डायरेक्टरी बनाती है और फिर cd की है, तो मैंने इसे एक उपनाम दिया। और यहाँ एक सार है जहाँ मैं इसका वर्णन करता हूँ।
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
बस उपरोक्त उत्तरों को स्वचालित करें और एक बार निष्पादन योग्य स्क्रिप्ट बनाएं:
fun='
mkcd ()
{
mkdir -p -- "$1" && cd -P -- "$1"
}'
echo "$fun" >> ~/.bashrc
बस इसे एक नई फ़ाइल में कॉपी करें mkcd.sh
और इसे टर्मिनल में केवल एक बार चलाएं bash mkcd.sh
। फिर source ~/.bashrc
इसे चालू सत्र में काम करने के लिए निष्पादित करें।
इसके बाद, आप mkcd some_dir
सीधे उस निर्देशिका में बनाने और दर्ज करने के लिए उपयोग कर सकते हैं ।
~/.bashrc
फ़ाइल में संलग्न करना है (एक उत्तर के साथ जो पहले ही दिया जा चुका है)? और आप इस mkcd.sh
स्क्रिप्ट को बनाने का सुझाव कैसे देते हैं ? एक संपादक के साथ, शायद? यह सिर्फ संपादन से ज्यादा काम की तरह दिखता है ~/.bashrc
। स्वीकृत उत्तर पर इसका क्या लाभ है? ……………………………………………………… पी एस यह मुद्दों को उद्धृत करने के कारण विफल हो जाएगा, जो मुझे बताता है कि आपने खुद भी कोशिश नहीं की है।
mcd
से unix.stackexchange.com/questions/6628/...