Zsh के साथ कमांड में वाइल्डकार्ड का उपयोग करना


39

जैसे आदेशों का उपयोग करना rsyncऔर scpसाथ ZSHमैं आपको समस्या आई है। मुझे सभी मेल खाने वाली फ़ाइलों को देने के सामान्य (सामान्य) व्यवहार के बजाय, यह नहीं चलेगा और वापस आ जाएगा:

  ~  rsync -azP user@server:~/* ~/
zsh: no matches found: user@server:~/*

मैं इसे कैसे ठीक करूं?

मेरे .zshrc

ZSH=$HOME/.oh-my-zsh
ZSH_THEME="robbyrussell"
plugins=(git brew)
source $ZSH/oh-my-zsh.sh
export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/local/sbin

जवाबों:


50

यह संबंधित है कि कैसे ZSH फ़ाइल नाम बनाने के लिए ग्लोबिंग वर्णों का प्रबंधन करते हैं। डिफ़ॉल्ट रूप से, ZSH फ़ाइलनाम उत्पन्न करेगा और कमांड को निष्पादित करने से पहले एक त्रुटि फेंक देगा यदि यह कोई मैच नहीं मिला।

इस व्यवहार को बायपास करने के कई तरीके हैं, उनमें से कुछ इस प्रकार हैं:

  • सबसे तेज है ग्लोबिंग पात्रों को उद्धरणों के साथ जोड़ना।
$ rsync -azP "user@server:~/*" ~/
  • स्थायी परिवर्तन के लिए, आपको अपनी .zshrcफ़ाइल में निम्नलिखित जोड़ना होगा :
unsetopt nomatch

यह ZSH को कोई मैच नहीं होने पर एक त्रुटि प्रिंट करने से रोकेगा।

  • एक और संभावना है कि noglobकमांड संशोधक का उपयोग करके किसी विशेष कमांड के लिए ग्लोबिंग को अक्षम करना है । .zshrcउदाहरण के लिए एक उपनाम सेट करके :
alias scp='noglob scp'

धन्यवाद! ऐसा कभी नहीं करना पड़ा bash
मॉर्गन

@ मॉर्गन वास्तव में अजीब है। उद्धरण के बिना, बैश को rsyncकभी भी देखने से पहले टिल्ड का विस्तार करना चाहिए । क्या ऐसा हो सकता है कि आप दोनों सर्वर पर होम डायरेक्टरी के लिए एक ही पथ का उपयोग कर रहे थे?
शाम

@slhck नहीं, वह सही है। zsh के पास वाइल्डकार्ड को कॉन्फ़िगर करने के लिए कुछ और विकल्प हैं, इसलिए इस व्यवहार को zshrc में बदला जा सकता है।
स्पैक

1
@ sa125 मैंने अपना उत्तर संपादित कर लिया है।
स्पैक

1
@slhck: bashकेवल एक टिल्ड फैलता है जब यह शुरू होता है एक के बाद एक शब्द, या है पहला वर्ण :या पहले =एक चर काम में। अन्यथा, इसका शाब्दिक उपचार किया जाता है।
चेपनर

8

मैं काफी महीनों से zpretzo का उपयोग कर रहा हूं और इस मुद्दे का अनुभव भी किया है। यदि आप कोई बदलाव नहीं करना चाहते हैं, तो मैं एक साफ और उपयोगी समाधान के साथ आया हूं: केवल कमांड में बैकस्लैश प्रीपेन्ड करें।

~/p/b/a/files ❯❯❯ scp *.* myserver@host:~/
*.*: No such file or directory

~/p/b/a/files ❯❯❯ \scp *.* myserver@host:~/
jquery.min.js                              100%   93KB  92.6KB/s   00:00
json2.min.js                               100%   3377   3.3KB/s   00:00

आशा है कि ये आपकी मदद करेगा!


महान समाधान !!
yorch

बिल्कुल सही, यह OSX पर मेरे लिए बहुत अच्छा काम किया!
s शैलियाँ

बहुत बढ़िया!! लेकिन किसी भी कारण से / यह कैसे काम करता है?
कन्नन राममूर्ति

3

यह URL को मैन्युअल रूप से उद्धृत किए बिना आपकी समस्या को हल करता है

autoload -U url-quote-magic  
zle -N self-insert url-quote-magic

# sort it out for SCP
some_remote_commands=(scp rsync)
zstyle -e :urlglobber url-other-schema \
  '[[ $some_remote_commands[(i)$words[1]] -le ${#some_remote_commands} ]] && reply=("*") || reply=(http https ftp)'

और यह .zshrc में जाता है?
मॉर्गन

हाँ, यह आपके zsh कॉन्फ़िगरेशन में जाता है। एफडब्ल्यूआईडब्ल्यू, बस एक नया शेल शुरू करें ( zsh -fएक कैनोनिकल शेल कॉन्फिडेंस के लिए), अपने शेल में कमांड को कॉपी और पेस्ट करें, और अपना rsyncकमांड टाइप (या पेस्ट) करें । आप काम पर जादू देखेंगे ;-) (URL पर विशेष वर्ण स्वचालित रूप से उद्धृत हो जाएंगे)
फ्रांसिस्को

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