Ubuntu 17.04 - bash: cd: quá nhiều đối số


10

Tôi vừa nâng cấp Ubuntu 16.04 lên 17.04 và thấy một vấn đề nhỏ với cdlệnh.

Hãy nói rằng tôi có hai thư mục: album-01&album-02

Trong Ubuntu 16.04, nếu tôi làm điều cd album*đó sẽ đi đến thư mục đầu tiên được tìm thấyalbum-01

Nhưng trong Ubuntu 17.04 mới, nếu tôi làm điều cd album*đó sẽ dẫn đến kết quả -bash: cd: too many arguments

Làm thế nào để tạo ra cdUbuntu 17.04 như cdtrong Ubuntu 16.04?


4
Những gì bạn nhận được có ý nghĩa, khi bạn đưa ra cdhai địa điểm, và bằng cách nào đó mong đợi nó sẽ tìm ra vị trí bạn muốn.
mikewhthing

1
@mikewhthing Thật không may, hướng dẫn Bash không đồng ý với bạn: "Bất kỳ đối số bổ sung nào sau thư mục đều bị bỏ qua"
muru

3
Đã đăng một báo cáo lỗi, trong trường hợp bất kỳ ai quan tâm: bug.launchpad.net/ubfox/+source/bash/+orms/1683576
muru

Xin đừng quên chấp nhận câu trả lời giúp bạn nhiều nhất bằng cách nhấp vào nút kiểm tra vòng màu xám ở bên trái, nếu câu hỏi của bạn được giải quyết thỏa đáng.
Chỉ huy Byte

Câu trả lời:


9

Tôi chưa thể kiểm tra điều này trên hệ thống 17.04 thực sự (chỉ xác minh rằng nó hoạt động vào ngày 16.04), nhưng bạn sẽ có thể ghi đè lệnh tích hợp cdBash bằng chức năng tùy chỉnh của riêng bạn, loại bỏ mọi đối số bổ sung ngoại trừ đối số đầu tiên :

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

Cập nhật: Như được đề xuất trong nhận xét của @ muru , phiên bản dưới đây có thể hoạt động tốt hơn và hỗ trợ gọi cdmà không cần đối số:

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

Sau khi bạn đã nhập dòng này ở trên trong thiết bị đầu cuối của mình, vui lòng xác minh xem cdbây giờ có hoạt động theo cách bạn muốn không. Nếu đây là trường hợp, bạn có thể làm cho định nghĩa hàm này liên tục bằng cách nối thêm dòng đó vào cuối ~/.bashrctệp của bạn . Nếu không, nó sẽ biến mất ngay sau khi bạn kết thúc phiên shell hiện tại của mình.

Lưu ý rằng nếu vì bất kỳ lý do gì bạn tạm thời cần sử dụng lệnh tích hợp cdBash thực sự thay vì chức năng tùy chỉnh này, bạn có thể chỉ cần gọi nó bằng command cdthay vì đơn giản cd.


Tôi đã viết điều tương tự, thay vì chức năng, tôi đã gợi ý một bí danh cho kịch bản nhỏ ... chắc chắn nó hoạt động;)
Ravexina

@Ravexina Tôi đã cân nhắc sử dụng bí danh trước tiên, nhưng sau đó đã bỏ qua vì tôi nghĩ không thể thực hiện được với bí danh, vì ở đó bạn không kiểm soát được các đối số. Vì tò mò, bạn sẽ gợi ý cách tiếp cận nào?
Chỉ huy Byte

Tôi đã làm điều tương tự, tôi chỉ cần đặt mã vào một .shtệp sau đó tạo một bí danh như:mcd="source /home/user/bin/cd.sh"
Ravexina

À, được rồi Đó là một chút phức tạp hơn nó sẽ cần, nhưng cũng nên làm việc.
Chỉ huy Byte

2
@SandiHidayat Hãy thử cd () { builtin cd "${@:1:1}"; }thay thế.
muru

7

Câu trả lời ngắn / Cách giải quyết

Để trả lời câu hỏi của bạn trong trường hợp chính xác này, nó hoạt động

cd album*1

Nhưng nó có thể không phải là chức năng bạn thực sự muốn.

Những gì đã thay đổi?

Dường như config-top.htrong Bash-4.4 đã được cập nhật để thêm tùy chọn sau

/* 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đề cập đến lỗi của bạn ở đây:

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

Tôi có thể làm gì lâu dài?:

Bạn có thể tự biên dịch bashmà không cần CD_COMPLAINS mới , nhưng điều đó sẽ trở nên tẻ nhạt. Bạn có thể xác định lại cdchức năng như được đề xuất ở đây hoặc bạn có thể đặt bí danh cho một chức năng như

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

Chứng minh điều đó

Bash 4.4 Beta nơi nó vẫn hoạt động

#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 Phát hành ổn định khi nó không hoạt động

#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

Xin lỗi, là một lỗi đánh máy. Cập nhật câu trả lời.
Grayson Kent

À, đúng rồi. Bạn chỉ có thể làm cd alb*1, để phù hợp với nghĩa đen 1ở cuối thậm chí không có dấu ngoặc. Tôi nhầm lẫn ý tưởng của bạn với một cái gì đó khác lúc đầu.
ilkkachu

5

Tôi chưa bao giờ gặp phải vấn đề này vì tôi luôn sử dụng Tab Hoàn thành.

Vì vậy, trong trường hợp của bạn, thay vì đoán chính xác thư mục nào tôi muốn, tôi sẽ nhập cd alTabnếu chỉ có một kết quả khớp, hoàn thành nó và nếu có 2 hoặc nhiều hơn hoàn thành đến nơi kết thúc khớp và TabTabliệt kê các lựa chọn.

Đây là một ví dụ từ hệ thống của tôi:

cd Un Tab

cd Unknown

tiếp theo là TabTabsản xuất

Unknown/                        Unknown Artist - Unknown Album/ 

2

Điều này trông giống như một lỗi trong Bash: theo man builtinshành vi cũ là hành vi đúng.

   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.

Bạn có thể báo cáo lỗi trong bug-bashdanh sách gửi thư; biết thêm chi tiết tại đây .


Trên thực tế, lỗi đã được báo cáo (từ lâu). Nếu bạn muốn một Bash cố định ngay bây giờ, bây giờ, bây giờ , đây là cách thực hiện đúng (được thử nghiệm vào ngày 17.10, cũng nên hoạt động trên những người khác).

Đầu tiên tạo một thư mục để làm việc, ví dụ:

mkdir ~/bash
cd ~/bash

Nhận gói nguồn và các phụ thuộc xây dựng:

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

Chỉnh sửa config-top.hđể thay đổi điều này (nên là dòng 32)

#define CD_COMPLAINS

đến đây

/* #define CD_COMPLAINS */

Chỉnh sửa debian/changelogvà thêm một mục như thế này ở trên cùng (bạn cũng có thể sử dụng lệnh 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

Những điểm quan trọng nhất là để phụ thêm +foocho hiện số phiên bản ( foocó thể là bất kỳ chuỗi các chữ thường, và hãy cẩn thận nếu bạn sử dụng dch -i, nó sẽ tăng số cuối cùng, vì vậy bạn cần để trở lại nó vào một hiện hành) và sử dụng tên phát hành chính xác ( artfulở đây). Cuối cùng, chạy dpkg-source --commit.

Sau đó, bạn có thể chạy debuildlệnh và nếu mọi thứ đều ổn (lỗi về debsigncó thể bỏ qua), bạn nên có một số .debs trong thư mục cha, bạn có thể cài đặt như bình thường (không cần phải cài đặt tất cả, chỉ cần bạn cài đặt chúng có ngay bây giờ, sử dụng dpkg -l | grep bashđể tìm hiểu).

Lưu ý rằng số phiên bản của gói mới được đặt để bạn sẽ tự động nhận được bất kỳ bản cập nhật nào trong tương lai bash; nếu bản cập nhật không khắc phục được sự cố, bạn phải lặp lại quy trình trên.

(Câu trả lời này lần đầu tiên được đăng trên câu hỏi trùng lặp này .)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.