एक उपनाम को परिभाषित करना और तुरंत इसका उपयोग करें


11

में zshइस काम करता है ठीक:

alias foo=ls
foo

लेकिन यह नहीं है:

alias foo=ls; foo

इंटरएक्टिव रूप से चलने पर अतिरिक्त समय दर्ज करना एक मुद्दा नहीं है। लेकिन जब sshइसके माध्यम से चलना अचानक समस्या बन जाता है:

% ssh zsh@server 'alias foo=ls; foo'
zsh:1: command not found: foo

एक नई पंक्ति के साथ भी यह काम नहीं करता है:

% ssh zsh@server 'alias foo=ls;
foo'
zsh:2: command not found: foo

अजीब बात यह है कि zshयह जानता है कि यह उपनाम है:

% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence

कैसे बताएं zshकि उपनाम सक्रिय होना चाहिए?


अलियासिंग के साथ यह एक आम समस्या है। मैं का उपयोग कर इसे करने की कोशिश bashऔर cshऔर वे उसी तरह व्यवहार किया। मुझे उम्मीद है कि कोई समझा सकता है।
स्लीक्स

बैश कोई समस्या नहीं है: ssh सर्वर 'shopt -s Expand_aliases; उपनाम उज् = ls \ njj'
ओले तांगे

जवाबों:


9

तुम यह नहीं कर सकते।

क्योंकि इतिहास विस्तार के बाद ही उपनामों का विस्तार किया गया था और पूरी लाइन को एक बार में पढ़ा गया था, इसलिए जब fooनिष्पादित किया गया था, तो उपनाम की विस्तार प्रक्रिया चली गई थी, शेल के लिए नए उपनाम को पहचानने में बहुत देर हो चुकी है।

सबसे अच्छा तरीका है कि आप उपनाम को परिभाषित .zshrcकर रहे हैं या फ़ंक्शन का उपयोग कर रहे हैं जैसे कि जिमीज का जवाब या उपयोग करना eval:

alias foo=ls; eval foo

Zsh -c के साथ एक विशेष मामला है । इस मामले में, उन उपनामों को परिभाषित किया गया था जिनका .zshenvविस्तार किया जाएगा।


यह व्याख्या नहीं करेगा कि ssh host 'alias foo=bar<newline>foo'काम क्यों नहीं करता है। वहाँ के लिए एक विशेष मामला हैzsh -c
स्टीफन चेज़लस

या उपयोग करेंalias foo=ls; eval foo
स्टीफन चेज़लस

@ स्टीफनचैलेज: सूचना के लिए धन्यवाद, उनके साथ अपडेट किया गया। sshमामले के बारे में , क्या आप इसे और अधिक स्पष्ट कर सकते हैं। मुझे लगता है कि कमांड को अभी भी एक बार में पढ़ा गया था।
cuonglm

10

यह बहुत अच्छी तरह से ज्ञात समस्या है जो zshअध्याय ALIASING (देखें man zshmisc) के तहत मैनुअल में भी वर्णित है । इसके साथ व्यवहार करने का एक तरीका यह है कि आप उर्फ ​​के बजाय फ़ंक्शन का उपयोग करें:

foo() { ls; } ; foo

या इससे भी बेहतर मामले में ls:

foo() { ls -- "${@:-.}"; } ; foo

ps। फ़ंक्शन परिभाषा (सूची) और रिक्त स्थान के अंत में अर्धविराम को zsh में आवश्यक नहीं है, लेकिन अन्य गोले से एक आदत के रूप में मैं अभी भी उन्हें डालता हूं।


1

कमांड लाइन से सी-शेल (सटीक होना tcsh) का उपयोग करना:

mymachine % alias showme "echo here it is"
mymachine % showme
here it is

या फिर इसे .cshrc फ़ाइल में रखें और फ़ाइल को स्रोत करें:

mymachine % source ~/.cshrc

mymachine % showme
here it is

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