Ubuntu 17.04 - Bash: CD: Çok fazla argüman


10

Sadece Ubuntu'yu 16.04'e 17.04'e yükselttim ve cdkomutla ilgili küçük bir sorun buldum .

Diyelim ki iki klasörüm var: album-01&album-02

Ubuntu 16.04'te, eğer yaparsam cd album*bulunan ilk klasöre gidecekalbum-01

Ama yeni Ubuntu 17.04'te bunu yaparsam cd album*sonuç veririm-bash: cd: too many arguments

Ubuntu 16.04 cdgibi Ubuntu 17.04 nasıl yapılır cd?


4
cdİki konum verirken elde ettiğiniz şey anlamlıdır ve bir şekilde hangisini istediğinizi bulmasını bekler.
mikewhatever

1
@mikewhatever Ne yazık ki, Bash el kitabı sizinle aynı fikirde değil: " Dizini izleyen herhangi bir ek argüman yok sayılır"
muru

3
Herkesin ilgilenmesi durumunda bir hata raporu yayınladı
muru

Sorunuz tatmin edici bir şekilde çözülmüşse lütfen solundaki gri yuvarlak onay düğmesini tıklayarak size en çok yardımcı olan yanıtı kabul etmeyi unutmayın.
Bayt Komutanı

Yanıtlar:


9

Bunu gerçek bir 17.04 sisteminde test edemedim (sadece 16.04'te çalıştığını doğruladım), ancak cdBash yerleşik komutunu kendi özel işlevinizle geçersiz kılabilmelisiniz, bu da birincisi dışında herhangi bir ek argümanı atar :

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

Güncelleme: @ muru'nun yorumunda önerildiği gibi , aşağıdaki bu sürüm daha iyi çalışabilir ve cdargüman olmadan çağrıyı destekleyebilir :

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

Bu satırı yukarıdaki terminalinize girdikten sonra, lütfen cdşimdi istediğiniz şekilde davranıp davranmadığını doğrulayın . Bu durumda, bu satırı ~/.bashrcdosyanızın sonuna ekleyerek bu işlev tanımını kalıcı hale getirebilirsiniz . Aksi takdirde mevcut kabuk oturumunuzu bitirir bitirmez yok olur.

Herhangi bir nedenden dolayı cdbu özel işlev yerine gerçek Bash yerleşik komutunu geçici olarak kullanmanız gerekiyorsa , basit command cdyerine yerine çağırabileceğinizi unutmayın cd.


Ben de aynı şeyi yazıyordum, fonksiyon yerine minik senaryoya bir takma isim öneriyordum ... işe yarıyor;)
Ravexina

@Ravexina İlk önce bir takma ad kullanmayı düşündüm, ancak daha sonra bunu bir takma adla yapılamayacağını düşündüğüm için bıraktım, çünkü orada argümanları kontrol etmediniz. Sadece meraktan, hangi yaklaşımı önerirsiniz?
Bayt Komutanı

Ben de aynı şeyi yaptım, ben sadece bir .shdosyaya kod koymak sonra bir takma ad oluşturdum:mcd="source /home/user/bin/cd.sh"
Ravexina

Ah tamam. Bu, olması gerekenden biraz daha karmaşıktır, ancak aynı zamanda çalışması gerekir.
Byte Komutanı

2
@SandiHidayat cd () { builtin cd "${@:1:1}"; }Bunun yerine deneyin .
muru

7

Kısa cevap / Geçici çözüm

Sorunuzu tam olarak bu durumda cevaplamak için, bu işe yarar

cd album*1

Ama muhtemelen gerçekten istediğiniz işlevsellik değildir.

Ne değişti?

config-top.hBash-4.4'te aşağıdaki seçeneği eklemek üzere güncellendiği anlaşılıyor

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

#define CD_COMPLAINS

Ve builtins/cd.defburada hatanızı ifade eder:

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

Uzun vadeli ne yapabilirim ?:

bashYeni CD_COMPLAINS olmadan kendiniz derleyebilirsiniz , ancak bu sıkıcı olur. cdBurada önerildiği gibi işlevselliği yeniden tanımlayabilir veya aşağıdaki gibi bir işlevi taklit edebilirsiniz

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

Kanıtlamak

Bash 4.4 Beta hala çalışıyor

#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

Bash 4.4 Çalışmıyorsa Kararlı Sürüm

#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

Üzgünüm, bir yazım hatasıydı. Cevap güncellendi.
Grayson Kent

Ah doğru. Köşeli parantez olmadan bile sonunda cd alb*1değişmez 1değeri eşleştirmek için bunu yapabilirsiniz . İlk başta fikrinizi başka bir şeyle karıştırdım.
ilkkachu

5

Her zaman Sekme Tamamlama kullandığım için bu sorunla hiç karşılaşmadım .

Yani sizin durumunuzda, hangi dizini istediğime dair kesin bir tahminde bulunmak yerine, cd alTabsadece bir eşleşme varsa, onu tamamlar ve eşleşmenin sona erdiği ve TabTabseçenekleri listelediği yere kadar 2 veya daha fazla tamamlama varsa hangisini yazarım.

İşte sistemimden bir örnek:

cd Un Tab

cd Unknown

ardından TabTabürünler

Unknown/                        Unknown Artist - Unknown Album/ 

2

Bu Bash bir hata gibi görünüyor: man builtinseski davranış başına doğru olanıdır.

   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-bashPosta listesindeki hatayı bildirebilirsiniz ; daha fazla ayrıntı burada .


Aslında, hata bildirildi (uzun zaman önce). Şimdi sabit bir Bash istiyorsanız, şimdi, şimdi , nasıl düzgün bir şekilde yapılacağı (17.10'da test edilmiş, başkaları üzerinde de çalışmalıdır).

Önce çalışmak için bir dizin oluşturun, örneğin:

mkdir ~/bash
cd ~/bash

Kaynak paketi ve derleme bağımlılıklarını alın:

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

Düzen config-top.hbunu değiştirmek için (hat 32 olmalı)

#define CD_COMPLAINS

buna

/* #define CD_COMPLAINS */

Düzen debian/changelogve (ayrıca komutunu kullanabilirsiniz üstünde böyle bir giriş ekleyin 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

En önemli noktalar +foo, geçerli sürüm numarasına eklenmelidir ( fooherhangi bir küçük harf dizisi olabilir; ve kullanırsanız dikkatli olun dch -i, son sayıyı artıracaktır, bu yüzden geçerli sayıya geri döndürmeniz gerekir) ve doğru sürüm adı ( artfulburada). Sonunda koş dpkg-source --commit.

Daha sonra debuildkomutu çalıştırabilirsiniz ve her şey yolunda giderse (hakkında hatalar debsigngöz ardı edilebilir) .deb, ana dizinde her zamanki gibi yükleyebileceğiniz bazı s'ler olmalıdır (hepsini yüklemenize gerek yoktur, sadece sizin şimdi var; dpkg -l | grep bashöğrenmek için kullanın ).

Yeni paketin sürüm numarasının gelecekteki güncellemeleri otomatik olarak alacağınız şekilde ayarlandığını unutmayın bash; güncelleme sorunu çözmezse, yukarıdaki işlemi tekrarlamanız gerekir.

(Bu yanıt ilk olarak bu yinelenen soru üzerine gönderildi .)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.