Ubuntu 17.04 - bash: cd: terlalu banyak argumen

10

Saya baru saja memutakhirkan Ubuntu 16.04 ke 17.04 dan menemukan sedikit masalah dengan cdperintah.

Katakanlah saya memiliki dua folder: album-01&album-02

Di Ubuntu 16.04, jika saya melakukannya cd album*akan pergi ke folder pertama yang ditemukanalbum-01

Tetapi di Ubuntu 17.04 baru, jika saya lakukan cd album*itu menghasilkan saya -bash: cd: too many arguments

Bagaimana cara membuatnya cddi Ubuntu 17.04 seperti cddi Ubuntu 16.04?

Hidayat
sumber
4
Apa yang Anda dapatkan memang masuk akal, ketika Anda memberikan cddua lokasi, dan entah bagaimana berharap untuk mengetahui mana yang Anda inginkan.
mikewhthing
1
@mikewhthing Sayangnya, manual Bash tidak setuju dengan Anda: "Setiap argumen tambahan direktori berikut diabaikan"
muru
3
Diposting laporan bug, kalau-kalau ada yang tertarik: bugs.launchpad.net/ubuntu/+source/bash/+bug/1683576
muru
Harap jangan lupa menerima jawaban yang paling membantu Anda dengan mengklik tombol centang putaran abu-abu di sebelah kirinya, jika pertanyaan Anda diselesaikan dengan memuaskan.
Byte Commander

Jawaban:

9

Saya belum bisa mengujinya pada sistem 17.04 yang sebenarnya (hanya diverifikasi yang berfungsi pada 16.04), tetapi Anda harus dapat mengesampingkan perintah cdbawaan Bash dengan fungsi kustom Anda sendiri, yang membuang argumen tambahan apa pun kecuali yang pertama :

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

Pembaruan: Seperti yang disarankan dalam komentar @ muru , versi di bawah ini mungkin berfungsi lebih baik dan mendukung panggilan cdtanpa argumen:

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

Setelah Anda memasukkan baris ini di atas di terminal Anda, harap verifikasi apakah cdsekarang berperilaku seperti yang Anda inginkan. Jika demikian, Anda dapat membuat definisi fungsi ini tetap ada dengan menambahkan baris itu ke akhir ~/.bashrcfile Anda . Kalau tidak, itu akan hilang segera setelah Anda mengakhiri sesi shell Anda saat ini.

Perhatikan bahwa jika karena alasan apa pun Anda sementara perlu menggunakan perintah cdBash built-in yang sebenarnya alih-alih fungsi kustom ini, Anda bisa menyebutnya dengan command cdalih - alih polos cd.

Komandan Byte
sumber
Saya menulis hal yang sama, alih-alih berfungsi, saya menyarankan alias ke skrip kecil ... pasti berhasil;)
Ravexina
@Ravexina Saya juga mempertimbangkan untuk menggunakan alias, tetapi kemudian membatalkannya karena saya pikir itu tidak dapat dilakukan dengan alias, karena di sana Anda tidak memiliki kontrol terhadap argumen. Hanya karena penasaran, pendekatan apa yang akan Anda sarankan?
Byte Commander
Saya melakukan hal yang sama, saya hanya memasukkan kode dalam .shfile kemudian membuat alias seperti:mcd="source /home/user/bin/cd.sh"
Ravexina
Ah, baiklah. Itu sedikit lebih rumit daripada yang seharusnya, tetapi harus bekerja juga.
Byte Commander
2
@SandiHidayat Coba cd () { builtin cd "${@:1:1}"; }sebagai gantinya.
muru
7

Jawaban singkat / Penanganan masalah

Untuk menjawab pertanyaan Anda dalam kasus persis ini, ini berfungsi

cd album*1

Tapi itu mungkin bukan fungsi yang Anda inginkan.

Apa yang berubah?

Tampaknya config-top.hdi Bash-4.4 telah diperbarui untuk menambahkan opsi berikut

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

#define CD_COMPLAINS

Dan builtins/cd.defmerujuk kesalahan Anda di sini:

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

Apa yang bisa saya lakukan jangka panjang ?:

Anda dapat mengkompilasi sendiri bashtanpa CD_COMPLAINS baru , tetapi itu akan membosankan. Anda dapat mendefinisikan kembali cdfungsionalitas seperti yang disarankan di sini atau Anda dapat alias fungsi seperti

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

Membuktikannya

Bash 4.4 Beta masih berfungsi

#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 Stable Release di tempat yang tidak berfungsi

#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
Grayson Kent
sumber
Maaf, salah ketik. Jawaban yang diperbarui.
Grayson Kent
Ah benar Anda bisa melakukannya cd alb*1, untuk mencocokkan literal 1pada akhirnya bahkan tanpa tanda kurung. Saya bingung ide Anda dengan sesuatu yang lain pada awalnya.
ilkkachu
5

Saya belum pernah mengalami masalah ini karena saya selalu menggunakan Tab Completion.

Jadi, dalam kasus Anda, alih-alih menebak dengan tepat ke direktori mana yang saya inginkan, saya akan mengetik cd alTabyang jika hanya ada satu yang cocok, melengkapinya dan jika ada 2 atau lebih selesai sampai di mana pencocokan berakhir dan TabTabdaftar pilihan.

Berikut ini contoh dari sistem saya:

cd Un Tab

cd Unknown

diikuti oleh TabTabmenghasilkan

Unknown/                        Unknown Artist - Unknown Album/ 
Penatua Geek
sumber
2

Ini terlihat seperti bug di Bash: per man builtinsperilaku lama adalah yang benar.

   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.

Anda dapat melaporkan bug di bug-bashmilis; lebih detail di sini .


Sebenarnya, bug itu dilaporkan (dulu). Jika Anda ingin Bash yang diperbaiki sekarang, sekarang, sekarang , inilah cara melakukannya dengan benar (diuji pada 17.10, harus bekerja pada yang lain juga).

Pertama buat direktori untuk dikerjakan, misalnya:

mkdir ~/bash
cd ~/bash

Dapatkan paket source dan dependensi build:

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

Edit config-top.huntuk mengubah ini (harus baris 32)

#define CD_COMPLAINS

untuk ini

/* #define CD_COMPLAINS */

Edit debian/changelogdan tambahkan entri seperti ini di bagian atas (Anda juga dapat menggunakan perintah 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

Poin yang paling penting adalah menambahkan +fooke nomor versi saat ini ( foobisa berupa string huruf kecil apa pun; dan berhati-hatilah jika Anda menggunakan dch -i, itu akan menambah angka terakhir, jadi Anda harus mengembalikannya ke yang sekarang) dan menggunakan nama rilis yang benar (di artfulsini). Akhirnya, jalankan dpkg-source --commit.

Anda kemudian dapat menjalankan debuildperintah, dan jika semuanya berjalan dengan baik (kesalahan tentang debsigndapat diabaikan) Anda harus memiliki beberapa .debdi direktori induk, yang dapat Anda instal seperti biasa (tidak perlu menginstal semuanya, hanya yang Anda miliki sekarang; gunakan dpkg -l | grep bashuntuk mencari tahu).

Perhatikan bahwa nomor versi paket baru diatur sehingga Anda akan secara otomatis mendapatkan pembaruan di masa mendatang bash; jika pembaruan tidak memperbaiki masalah, Anda harus mengulangi proses di atas.

(Jawaban ini pertama kali diposting pada pertanyaan rangkap ini .)

fkraiem
sumber