उबंटू 17.04 - बैश: सीडी: बहुत सारे तर्क


10

मैंने अभी अपने उबंटू को 16.04 से 17.04 तक अपग्रेड किया और cdकमांड के साथ थोड़ी समस्या पाई ।

मान लीजिए कि मेरे पास दो फ़ोल्डर हैं: album-01औरalbum-02

उबंटू में 16.04, अगर मैं ऐसा cd album*करता हूं तो पाया गया पहला फ़ोल्डर जाएगाalbum-01

लेकिन नए उबंटू में 17.04, अगर मैं ऐसा cd album*करता हूं तो मुझे परिणाम मिलेगा-bash: cd: too many arguments

Ubuntu 16.04 की cdतरह Ubuntu 17.04 में कैसे बना जाए cd?


4
आपको जो मिलता है वह समझ में आता है, जैसा कि आप cdदो स्थान देते हैं, और किसी भी तरह से यह पता लगाने की अपेक्षा करते हैं कि आप कौन सा चाहते हैं।
मिखावट्वर

1
@mikewhatever दुर्भाग्य से, बैश मैनुअल आपसे असहमत है: " निर्देशिका के बाद किसी भी अतिरिक्त तर्क को नजरअंदाज किया जाता है"
muru

3
बग रिपोर्ट, किसी की दिलचस्पी के मामले में पोस्ट की गई: Bugs.launchpad.net/ubuntu/+source/bash/+bug/1683576
muru

कृपया उस उत्तर को स्वीकार करना न भूलें जो आपके बाईं ओर ग्रे राउंड चेक बटन पर क्लिक करके आपकी सबसे अधिक मदद करता है, यदि आपका प्रश्न संतोषजनक रूप से हल किया गया है।
बाइट कमांडर

जवाबों:


9

मैं अभी तक एक वास्तविक 17.04 प्रणाली पर यह परीक्षण नहीं कर सका (केवल सत्यापित किया गया कि यह 16.04 पर काम करता है), लेकिन आपको cdअपने स्वयं के कस्टम फ़ंक्शन के साथ बैश बिल्ट-इन कमांड को ओवरराइड करने में सक्षम होना चाहिए , जो पहले एक को छोड़कर किसी भी अतिरिक्त तर्क को खारिज करता है। :

cd(){ command cd "$1" ; }

अपडेट: जैसा कि @ muru की टिप्पणी में सुझाया गया है , नीचे दिया गया यह संस्करण बेहतर काम कर सकता है और cdबिना तर्क के कॉलिंग का समर्थन कर सकता है:

cd(){ builtin cd "${@:1:1}"; }

आपके टर्मिनल में ऊपर इस लाइन में प्रवेश करने के बाद, कृपया सत्यापित करें कि cdअब आप जिस तरह से चाहते हैं वैसा ही व्यवहार करते हैं। यदि यह मामला है, तो आप अपनी ~/.bashrcफ़ाइल के अंत में उस पंक्ति को जोड़कर इस फ़ंक्शन की परिभाषा को लगातार बना सकते हैं । अन्यथा यह आपके वर्तमान शेल सत्र को समाप्त करते ही गायब हो जाएगा।

ध्यान दें कि यदि किसी भी कारण से आपको अस्थायी रूप cdसे इस कस्टम फ़ंक्शन के बजाय वास्तविक बैश बिल्ट-इन कमांड का उपयोग करने की आवश्यकता है , तो आप सीधे command cdसादे के बजाय इसे कॉल कर सकते हैं cd


मैं एक ही बात लिख रहा था, फ़ंक्शन के बजाय मैं एक छोटे से स्क्रिप्ट के लिए एक उपनाम का सुझाव दे रहा था ... निश्चित रूप से यह काम करता है;)
रवेक्सिना

@ रेवेक्सिना मैंने पहले भी एक उपनाम का उपयोग करने पर विचार किया था, लेकिन फिर गिरा दिया क्योंकि मुझे लगता है कि यह एक उपनाम के साथ नहीं किया जा सकता है, क्योंकि आपके पास तर्कों पर नियंत्रण नहीं है। जिज्ञासा से बाहर, आपने क्या दृष्टिकोण सुझाया होगा?
बाइट कमांडर

मैंने एक ही काम किया, मैंने सिर्फ एक .shफाइल में कोड डाला, फिर एक उपनाम बनाया जैसे:mcd="source /home/user/bin/cd.sh"
रेवेक्सिना

आह अच्छा। यह थोड़ा और अधिक जटिल है जितना इसे करने की आवश्यकता होगी, लेकिन साथ ही साथ काम करना चाहिए।
बाइट कमांडर

2
@ शांतीहिदत cd () { builtin cd "${@:1:1}"; }इसके बजाय प्रयास करें ।
मूरू

7

संक्षिप्त उत्तर / समाधान

इस सटीक मामले में आपके प्रश्न का उत्तर देने के लिए, यह काम करता है

cd album*1

लेकिन यह शायद वह कार्यक्षमता नहीं है जो आप वास्तव में चाहते हैं।

किया बदल गया?

ऐसा प्रतीत होता है कि config-top.hबाश-4.4 में निम्नलिखित विकल्प को जोड़ने के लिए अद्यतन किया गया था

/* Define CD_COMPLAINS if you want the non-standard, but sometimes-desired
   error messages about multiple directory arguments to `cd'. */

#define CD_COMPLAINS

और builtins/cd.defयहां अपनी त्रुटि को संदर्भित करता है:

#if defined (CD_COMPLAINS)
  else if (list->next)
    {
      builtin_error (_("too many arguments"));
      return (EXECUTION_FAILURE);
    }
#endif

मैं दीर्घकालिक क्या कर सकता हूं ?:

आप bashनए CD_COMPLAINS के बिना अपना खुद का संकलन कर सकते हैं , लेकिन यह थकाऊ होगा। आप यहां बताई गई cdकार्यक्षमता को फिर से परिभाषित कर सकते हैं या आप किसी फ़ंक्शन को अन्य नाम दे सकते हैं

cd "$(find $1* | head -1)"

इसे साबित करना

बैश 4.4 बीटा जहां यह अभी भी काम करता है

#Pulling and unpacking source
$ wget https://ftp.gnu.org/gnu/bash/bash-4.4-beta.tar.gz
$ tar -xzvf bash-4.4-beta.tar.gz
$ cd bash-4.4-beta

#Building, go grab something to drink. It's gonna be a while.
~/bash-4.4-beta$ ./configure
~/bash-4.4-beta$ make

#Check Version
~/bash-4.4-beta$ ./bash --version
GNU bash, version 4.4.0(1)-beta (x86_64-unknown-linux-gnu)

#Enter a clean interactive prompt
~/bash-4.4-beta$ env -i PATH="$PWD:$PATH" ./bash --noprofile --norc

#Test example
bash-4.4$ mkdir album-0{1..2}
bash-4.4$ cd album* && pwd
/home/gkent/bash-4.4-beta/album0-1

बैश 4.4 स्थिर रिलीज जहां यह काम नहीं करता है

#Pulling and unpacking source
$ wget https://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz
$ tar -zxvf bash-4.4.tar.gz
$ cd bash-4.4/

#Building, go grab something to drink. It's gonna be a while.
~/bash-4.4$ ./configure
~/bash-4.4$ make

#Check Version
~/bash-4.4$ ./bash -version
GNU bash, version 4.4.0(1)-release (x86_64-unknown-linux-gnu)

#Enter a clean interactive prompt
~/bash-4.4$ env -i PATH="$PWD:$PATH" ./bash --noprofile --norc

#Test example
bash-4.4$ mkdir album-0{1..2}
bash-4.4$ cd album*
bash: cd: too many arguments

क्षमा करें, एक टाइपो था। अद्यतन उत्तर।
ग्रेसन केंट

ओह सही। आप बस कर सकते हैं cd alb*1, 1कोष्ठक के बिना भी अंत में शाब्दिक मिलान करने के लिए । मैंने पहली बार में आपके विचार को कुछ और के साथ भ्रमित किया।
ilkkachu

5

मैंने इस मुद्दे का कभी सामना नहीं किया है क्योंकि मैं हमेशा टैब कम्प्लीशन का उपयोग करता हूं

इसलिए आपके मामले में, मैं जिस निर्देशिका को चाहता हूं, उसके विपरीत अनुमान लगाने के बजाय, मैं यह लिखूंगा cd alTabकि यदि केवल एक ही मैच है, तो इसे पूरा करता है और यदि मिलान समाप्त होता है और TabTabविकल्पों को सूचीबद्ध करता है, तो 2 या अधिक पूर्ण होते हैं।

यहाँ मेरे सिस्टम से एक उदाहरण है:

cd Un Tab

cd Unknown

TabTabउत्पादन के बाद

Unknown/                        Unknown Artist - Unknown Album/ 

2

यह बश में बग की तरह दिखता है: man builtinsपुराने व्यवहार के अनुसार सही है।

   cd [-L|[-P [-e]] [-@]] [dir]
              Change the current directory to dir.  if dir is not supplied,
              the  value  of  the  HOME shell variable is the default.  Any
              additional arguments following dir are ignored.

आप bug-bashमेलिंग सूची पर बग की रिपोर्ट कर सकते हैं ; यहाँ अधिक जानकारी ।


दरअसल, बग की सूचना मिली थी (बहुत पहले)। यदि आप एक निश्चित बैश चाहते हैं, अब, अब , यहाँ, इसे ठीक से कैसे करें (17.10 पर परीक्षण किया गया है, तो दूसरों पर भी काम करना चाहिए)।

उदाहरण के लिए, काम करने के लिए पहले एक निर्देशिका बनाएँ:

mkdir ~/bash
cd ~/bash

स्रोत पैकेज और निर्माण निर्भरताएँ प्राप्त करें:

apt-get source bash
sudo apt-get build-dep bash
cd bash-4.4

config-top.hइसे बदलने के लिए संपादित करें (32 पंक्ति होना चाहिए)

#define CD_COMPLAINS

इसके लिए

/* #define CD_COMPLAINS */

संपादित करें debian/changelogऔर शीर्ष पर इस तरह एक प्रविष्टि जोड़ें (आप कमांड का उपयोग भी कर सकते हैं dch -i):

bash (4.4-5ubuntu1+cd) artful; urgency=medium

  * Fix cd.

 -- Firas Kraiem <firas@fkraiem.org>  Thu, 04 Jan 2018 21:11:22 +0900

सबसे महत्वपूर्ण अंक संलग्न करने के लिए कर रहे हैं +fooकरने के लिए वर्तमान (संस्करण संख्या foo, और सावधान करता है, तो आप का उपयोग हो सकता है छोटे अक्षरों के किसी भी स्ट्रिंग हो सकती है dch -i, यह पिछले संख्या है, तो आप वर्तमान एक के लिए उसे वापस लाना चाहें तब बढ़ेगी) और उपयोग करने के लिए सही रिलीज नाम ( artfulयहाँ)। अंत में, भागो dpkg-source --commit

फिर आप debuildकमांड को चला सकते हैं , और अगर सब कुछ ठीक हो जाता है (त्रुटियों के बारे में त्रुटियों debsignको अनदेखा किया जा सकता है) तो आपके पास .debमूल निर्देशिका में कुछ एस होना चाहिए , जिसे आप हमेशा की तरह स्थापित कर सकते हैं (उन सभी को स्थापित करने की कोई आवश्यकता नहीं है, बस आप ही हैं अब है; dpkg -l | grep bashपता लगाने के लिए उपयोग करें)।

ध्यान दें कि नए पैकेज का संस्करण क्रमांक सेट किया गया है ताकि आपको भविष्य का कोई भी अपडेट स्वतः मिल जाए bash; यदि अद्यतन समस्या को ठीक नहीं करता है, तो आपको उपरोक्त प्रक्रिया को दोहराना होगा।

(यह उत्तर पहली बार इस डुप्लिकेट प्रश्न पर पोस्ट किया गया था ।)

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