Có thể ghi đè lên dòng lệnh được xây dựng trong lệnh cd cd không?


22

Cứ sau mỗi lần tôi 'cd' vào một thư mục khác trên máy của mình (trong trường hợp này, chạy Mac OS X 10.6.7) qua dòng lệnh (là bash), tôi lập tức gõ 'ls' để lấy danh sách nội dung trong thư mục đó. Tôi đang cố gắng tìm ra cách ghi đè 'cd' để nó thay đổi thư mục được yêu cầu và sau đó đưa cho tôi danh sách trong một lần chụp.

Tôi đã có thể có được chức năng cơ bản mà tôi đang tìm cách làm việc bằng dòng sau được thêm vào ~ / .bash_profile của tôi

function cl() { cd "$@"; ls -l; }

Điều này hoạt động như mong đợi. Thay đổi thư mục được yêu cầu và sau đó hiển thị cho tôi nội dung. Trường hợp tôi gặp phải một vấn đề là cố gắng ghi đè chính "cd" thay vì tạo lệnh "cl" mới.

Những điều sau đây không hoạt động

##### Attempt 1 #####
# Hangs the command line

function cd() { cd "$@"; ls -l; }


##### Attempt 2 #####
# Hangs the command line

function cd() { 'cd' "$@"; ls -l; }


##### Attempt 3 #####
# Does not change directory. 
# Does list contents, but of the directory where you started.

function cd() { /usr/bin/cd "$@"; ls -l; }


#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;

Tôi cũng đã thử một số lần lặp khác không được liệt kê cũng như tạo một bí danh trỏ đến chức năng 'cl' hoạt động. Không ai trong số đó làm việc.

Những gì tôi đã đọc trong tài liệu nói về thực tế rằng 'cd' không thể chạy như một lệnh bên ngoài (đó là điều tôi hiểu là cách mà chức năng sẽ cần sử dụng nó).

Vì vậy, hiện tại tôi có thể sử dụng lệnh "cl" của mình và nhận được những gì tôi muốn, nhưng câu hỏi là / vẫn:

Có cách nào để ghi đè hành vi của 'cd' để thay đổi thư mục được yêu cầu và sau đó thực hiện một thao tác nào khác không?

Câu trả lời:


30

Sau đây nên làm việc:

function cd() { builtin cd "$@" && ls -l; }

Vì hàm nằm trên một dòng duy nhất, hãy đảm bảo rằng nó được kết thúc ;như trên để hoạt động chính xác.


Không hoạt động cho một cuộc gọi không tham số.
Daniel Beck

3
@DanielBeck - ít nhất là trên Mac OSX của tôi (10.6.7), nó hoạt động tốt với một cuộc gọi không tham số. Hành vi là nó thay đổi thư mục chính và sau đó thực hiện danh sách của thư mục đó. Hiệu quả sao chép chức năng của 'cd' cũ với tính năng mới được thêm vào cuối.
Alan W. Smith

2
@Alan Đúng, tôi đã kiểm tra điều đó bằng cách viết mã ad-hoc vào shell. Có vẻ như hành vi của cd ""(với những gì câu trả lời này nên đánh giá khác cd "$@"với trống rỗng $@. Xin lỗi về sự nhầm lẫn.
Daniel Beck

@DanielBeck - không phải lo lắng.
Alan W. Smith

2
Lưu ý: Tôi đang thay đổi câu trả lời này thành câu trả lời được chấp nhận vì đây là câu trả lời chính xác cho câu hỏi. Cái của @RichHomolka là tuyệt vời để giải quyết vấn đề của hiệu trưởng, nhưng cái này chính xác là những gì có thể được đặt trong tệp ~ / .bash_profile của bạn.
Alan W. Smith

10

Tôi nghĩ rằng bạn đang chạy vào một vòng lặp. cdChức năng của bạn đang gọi cd, đó là ... chức năng.

Bạn cần biết builtintừ khóa nào giúp tra cứu lệnh sử dụng các nội hàm Bash như cd chứ không phải chức năng của bạn

function cd
{
    builtin cd "$1"
    : do something else
}

Ngoài ra, gọi /usr/bin/cdsẽ không bao giờ hoạt động, ngay cả khi một lệnh như vậy tồn tại.

Chuyện gì sẽ xảy ra:

  • Vỏ Bash của tôi là trong dir /bash/dir.
  • Tôi chạy một lệnh /usr/bin/cd /dir/for/cd.
  • /usr/bin/cdđi vào dir /dir/for/cd.
  • /usr/bin/cd lối thoát hiểm
  • Bash vẫn còn /bash/dir, bởi vì quá trình con /usr/bin/cdkhông thể ảnh hưởng đến cha mẹ.

Ngoài ra bí danh là thay thế văn bản đơn giản. Họ không bao giờ có thể có các tham số.


Tôi đề nghị builtin cd $@ && ls; vì cdcuộc gọi sẽ thành công cho mọi thứ khác có ý nghĩa. Ngoài ra, hãy nhớ các trường hợp đặc biệt như cd(không có đối số).
Daniel Beck

Lưu ý bên lề: Tôi đã cố gắng đánh dấu đây là câu trả lời được chấp nhận, nhưng nó nói với tôi rằng tôi phải đợi thêm 6 phút nữa trước khi tôi có thể làm điều đó. Không biết đã có một sự chậm trễ được xây dựng trước khi bạn có thể làm điều đó.
Alan W. Smith

@Alan Một giải pháp khác tốt hơn có thể xuất hiện trong một khung thời gian rất hợp lý (tức là vài phút bạn phải chờ). Tôi đoán đó là lý do tại sao có sự chậm trễ bắt buộc của hệ thống: Bạn nên thích chất lượng hơn tốc độ. Nó không nên là quá nhiều bất tiện.
Daniel Beck

Và chúng ta có một người chiến thắng. Điều này hoạt động như một nhà vô địch. Mỗi @DanielBeck, tôi đã thay đổi để sử dụng && và cô đọng nó thành một dòng với: function cd {buildin cd "$ @" && ls -l; }
Alan W. Smith

@DanielBeck - Vâng, tôi sẽ không lo lắng về điều đó. Chỉ cần không bao giờ nhận thấy nó trước đây. Tôi có thể thấy logic trong đó, chỉ làm tôi ngạc nhiên một chút.
Alan W. Smith

6

Tôi đề nghị không ghi đè lên cd vì có một số tập lệnh khác chiếm quyền điều khiển 'cd', ví dụ: rvm. Thay vào đó, tốt hơn là chọn một tên khác, như 'd', và không chỉ định loại 'dựng sẵn' trong chức năng của bạn; nếu không, không tặc sẽ không hoạt động. Tôi đang sử dụng mã dưới đây:

function d() { cd "$@" && ls;} 

Tôi nghĩ rằng điều này sẽ không hoạt động mặc dù, theo câu hỏi của OP.
dùng305964
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.