2010-04-09 19 views
6

मैं सीडी !!: 1 के लिए उपनाम लिखने की कोशिश कर रहा हूं, जो पिछले कमांड का दूसरा शब्द लेता है, और उस नाम की निर्देशिका में बदल जाता है। उदाहरण के लिए, यदि मैंक्या मेरे पास शैल उपनाम इतिहास प्रतिस्थापन कमांड का मूल्यांकन कर सकता है?

rails new_project 
cd !!:1 

दूसरी पंक्ति "new_project" निर्देशिका में सीडी करेगा।

चूंकि !!: 1 टाइप करने के लिए अजीब है (भले ही यह छोटा हो, फिर भी कीबोर्ड के विपरीत किनारों पर तीन SHIFTed कुंजी की आवश्यकता होती है, और तब कुंजी के एक unSHIFTED संस्करण को दो बार टाइप किया गया था), मैं चाहता हूं सिर्फ

cd- 

की तरह लेकिन जब से कुछ टाइप करने के लिए !!: 1, कमांड लाइन पर मूल्यांकन किया जाता है मैं (जाहिर है) सिर्फ ऐसा नहीं कर सकते

alias cd-=!!:1 

या मैं एक उपनाम बचत होगी जिसमें "new_project" हार्ड-कोड किया गया था। 1 का मूल्यांकन नहीं किया जाता और मुझे लगता है कि कोई निर्देशिका नाम के एक संदेश मिलता है !!: 1 से मौजूद है तो मैं करने की कोशिश की

alias cd-='!!:1' 

इस के साथ समस्या यह है कि !! है। मैं एक उपनाम कैसे बना सकता हूं जहां इतिहास प्रतिस्थापन का मूल्यांकन किया जाता है, जब मैं एलआईएएस कमांड जारी करता हूं, न कि जब मैं उपनाम को परिभाषित करता हूं, और कभी नहीं?

(मैं दोनों बैश में इस की कोशिश की है और zsh, और दोनों में एक ही परिणाम मिलता है।)

+0

यूनिक्स पर संभव: http://unix.stackexchange.com/questions/85352/how-can-i-alias-sudo/85354 –

उत्तर

6

zsh के लिए:

alias cd-='cd ${${(z)$(fc -l -1)}[3]}' 

यह कैसे काम करता है:

  1. $(fc -l -1) मूल्यांकन किया जाता है। fc -l {start} [{end}] का अर्थ है «सूची इतिहास आदेश {start} से {end} या अंतिम अगर {end} मौजूद नहीं है»।
  2. ${(z)...} को ... को सरणी की तरह सरणी में विभाजित करना चाहिए (man zshexpn में «पैरामीटर विस्तार ध्वज» देखें), लेकिन वास्तव में यह रिक्त स्थान पर विभाजित होता है। शायद यह केवल मेरी बग है।
  3. ${...[3]} सरणी से तीसरा मान लेता है। पहला मान कमांड की एक संख्या है, दूसरा कमांड है और तीसरा और बाद में तर्क हैं।
+0

मैंने अभी कुछ ऐसा किया और 'fc ... के साथ समाप्त हो गया। कट-डी '' -f4-', जो कमांड की अग्रणी संख्या को हटा देता है। –

9

बैश के लिए:

alias cd-='cd $(history -p !!:1)' 
+0

बैश में बहुत अच्छा: धन्यवाद! दुर्भाग्य से यह zsh में काम नहीं करता है। आदमी इतिहास और इतिहास --help बेकार हैं, और मैं Googling के माध्यम से कुछ भी खोजने में सक्षम नहीं है ... कोई विचार? – iconoclast

+1

'इतिहास' एक अंतर्निहित zsh कमांड है। 'मैन zshbuiltins' का प्रयोग करें। – ZyX

+0

मैंने सोचा कि बैक कोट्स का उपयोग करके ऐसा करने का एक तरीका भी था। जैसे 'उपनाम सीडी - = 'सीडी \' !!: 1 \ ''' '। जो अधिक संक्षिप्त होगा (अगर मैं इसे काम करने के लिए प्राप्त कर सकता हूं!) –

8

एक और तरीका है एक ही बात को पूरा करने के :

अंतिम तर्क के लिए:

cdAlt -

या

cdEsc

पहला तर्क के लिए:

cdAlt - Ctrl - y

या

cdEscCtrl - y