Pertanyaan Ubuntu 17.04 - bash: cd: terlalu banyak argumen


Saya baru saja memperbarui Ubuntu 16.04 saya menjadi 17.04 dan menemukan sedikit masalah cd perintah.

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

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

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

Bagaimana membuat cd di Ubuntu 17.04 suka cd di Ubuntu 16.04?


9
2018-04-17 14:07


asal


Apa yang Anda dapatkan masuk akal, seperti yang Anda berikan cd dua lokasi, dan entah bagaimana mengharapkannya untuk mencari tahu mana yang Anda inginkan. - mikewhatever
@mikewhatever Sayangnya, manual Bash tidak setuju dengan Anda: "Setiap tambahan argumen berikut direktori diabaikan " - muru
Memposting laporan bug, siapa tahu ada yang tertarik: bugs.launchpad.net/ubuntu/+source/bash/+bug/1683576 - muru
Jangan lupa untuk menerima jawaban yang paling membantu Anda dengan mengklik tombol cek bulat abu-abu di sebelah kirinya, jika pertanyaan Anda terpecahkan dengan memuaskan. - Byte Commander


Jawaban:


Saya tidak dapat menguji ini pada sistem 17.04 nyata (hanya memverifikasi bahwa ia bekerja pada 16.04), tetapi Anda harus dapat menimpa cd Bash built-in command dengan fungsi kustom Anda sendiri, yang membuang argumen tambahan kecuali yang pertama:

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

Memperbarui: Seperti yang disarankan di komentar @ muru, versi di bawah ini mungkin berfungsi lebih baik dan mendukung panggilan cd tanpa argumen sekalipun:

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

Setelah Anda memasukkan baris ini di atas di terminal Anda, harap verifikasi cd sekarang berperilaku seperti yang Anda inginkan. Jika ini kasusnya, Anda dapat membuat definisi fungsi ini terus-menerus dengan menambahkan baris itu ke ujung Anda ~/.bashrc mengajukan. Jika tidak, maka akan menghilang segera setelah Anda mengakhiri sesi shell Anda saat ini.

Perhatikan bahwa jika karena alasan apa pun Anda perlu menggunakan yang asli untuk sementara cd Bash built-in command, alih-alih fungsi kustom ini, Anda cukup memanggilnya command cd bukannya polos cd.


8
2018-04-17 14:48



Saya menulis hal yang sama, daripada fungsi saya menyarankan alias ke skrip kecil ... yakin itu bekerja;) - Ravexina
@Ravexina Saya juga mempertimbangkan untuk menggunakan alias terlebih dahulu, tetapi kemudian menghapusnya karena saya pikir itu tidak dapat dilakukan dengan alias, karena di sana Anda tidak memiliki kendali atas argumen. Hanya ingin tahu, pendekatan apa yang akan Anda usulkan? - Byte Commander
Saya melakukan hal yang sama, saya hanya memasukkan kode dalam .sh file lalu buat alias seperti: mcd="source /home/user/bin/cd.sh" - Ravexina
Ah, baiklah. Itu sedikit lebih rumit daripada yang seharusnya, tetapi harus berfungsi juga. - Byte Commander
@SandiHidayat Coba cd () { builtin cd "${@:1:1}"; } sebagai gantinya. - muru


Jawaban singkat / Solusi

Untuk menjawab pertanyaan Anda dalam kasus ini, ini berhasil

cd album*1

Tetapi mungkin bukan fungsi yang benar-benar Anda inginkan.

Apa yang berubah?

Sepertinya config-top.h di 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.def mengacu pada 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 mengompilasi sendiri bash tanpa yang baru CD_COMPLAINS, tapi itu akan membosankan. Anda dapat mendefinisikan kembali cd fungsi seperti yang disarankan di sini atau Anda bisa alias fungsi seperti

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

Membuktikannya

Bash 4.4 Beta dimana 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 Rilis Stabil di mana 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

7
2018-04-17 16:15



Maaf, itu salah ketik. Jawaban yang diperbarui. - Grayson Kent
Ah benar. Anda hanya bisa melakukannya cd alb*1, untuk mencocokkan literalnya 1 pada akhirnya bahkan tanpa tanda kurung. Saya bingung ide Anda dengan sesuatu yang lain pada awalnya. - ilkkachu


Saya belum pernah menemui masalah ini karena saya selalu menggunakannya Penyelesaian Tab.

Jadi dalam kasus Anda, daripada memiliki tebakan yang tidak tepat mengenai direktori mana yang saya inginkan, saya akan mengetik cd alTab yang jika hanya ada satu pertandingan, selesaikan dan jika ada 2 atau lebih selesai hingga di mana pencocokan berakhir dan TabTab daftar pilihannya.

Berikut ini contoh dari sistem saya:

cd Un  Tab

cd Unknown

diikuti oleh TabTab menghasilkan

Unknown/                        Unknown Artist - Unknown Album/ 

4
2018-04-18 14:02





Ini terlihat seperti bug di Bash: per man builtins perilaku 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-bash milis; keterangan lebih lanjut sini.


Sebenarnya, bug itu dilaporkan (lama). Jika Anda menginginkan Bash tetap sekarang, sekarang, sekarang, beginilah cara melakukannya dengan benar (diuji pada 17.10, harus bekerja pada orang lain juga).

Pertama buat direktori untuk bekerja, misalnya:

mkdir ~/bash
cd ~/bash

Dapatkan paket sumber dan membangun dependensi:

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

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

#define CD_COMPLAINS

untuk ini

/* #define CD_COMPLAINS */

Edit debian/changelog dan 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 +foo ke arus nomor versi (foo bisa berupa string huruf kecil apa pun; dan berhati-hatilah jika Anda menggunakannya dch -i, itu akan menaikkan angka terakhir, jadi Anda perlu mengembalikannya ke nomor yang sekarang) dan menggunakan nama rilis yang benar (artful sini). Akhirnya, jalankan dpkg-source --commit.

Anda kemudian dapat menjalankan debuild perintah, dan jika semuanya berjalan dengan baik (kesalahan tentang debsign dapat diabaikan) Anda harus memiliki beberapa .debdi direktori induk, yang dapat Anda instal seperti biasa (Anda tidak perlu menginstal semuanya, hanya yang ada sekarang; gunakan dpkg -l | grep bash untuk 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 mengulang proses di atas.

(Jawaban ini pertama kali dipasang pertanyaan duplikat ini.)


2
2018-01-04 12:55