Điều này, từ một bài đăng trên blog của tôi vài tháng trước, đã trở thành một ý tưởng mà tôi nghĩ là tuyệt vời đối với một trong những vụ hack nhỏ nhất mà tôi đã ho trong bộ nhớ gần đây. Tôi trích dẫn nó đầy đủ ở đây:
==================
Tôi dành rất nhiều thời gian trong bash. Đối với người không quen biết, bash là một hệ thống mà bạn sẽ tìm thấy trên hầu hết các máy unix và, may mắn thay, một số cửa sổ và mọi máy Mac ngoài kia. Thoạt nhìn, nó không khác gì giao diện dòng lệnh, và do đó, tắt radar của hầu hết người dùng, những người nhìn thấy những thứ như lỗi thời mà họ muốn quên đi.
Tôi làm gần như tất cả mọi thứ trong bash. TÔI ĐỌC EMAIL CỦA TÔI TỪ MỘT LINE LINE, đó là lý do tại sao tôi tránh email được đánh dấu. Tôi điều hướng thư mục, chỉnh sửa tệp, tham gia kiểm tra và phân phối mã nguồn hàng ngày, tìm kiếm tệp, tìm kiếm bên trong tệp, khởi động lại máy của tôi và thậm chí thỉnh thoảng duyệt các trang web từ dòng lệnh. bash là trái tim và linh hồn của sự tồn tại kỹ thuật số của tôi.
Vấn đề là tôi có xu hướng mở khoảng 6 cửa sổ bash. Trong công việc hôm nay, tôi có một máy chủ đang chạy một máy chủ web, một cơ sở dữ liệu khác, cơ sở dữ liệu thứ ba, thứ tư và thứ năm chỉnh sửa các tệp khác nhau, trong khi một máy thứ sáu đang cố gắng ghi lại tên của mọi tệp trên hệ thống. Tại sao? Bởi vì thật tiện lợi khi có thể tìm kiếm thông qua một kho lưu trữ như vậy nếu bạn muốn biết nơi tìm một đối tượng theo tên tệp.
Khi bạn làm điều này, bạn sẽ có rất nhiều cửa sổ trong thanh điều khiển có tên đơn giản là "bash". Điều này tốt nếu bạn chỉ có một trong số họ, nhưng thật đau đớn khi bạn có 6 hoặc nhiều hơn .... và hai chục thứ khác đang diễn ra. Tôi có ba màn hình theo lệnh đồng thời của một cặp bàn phím / chuột và tôi vẫn cảm thấy cần nhiều hơn nữa. Mỗi cửa sổ có một số thiết bị đầu cuối bash mở.
Vì vậy, tôi đã kết hợp điều này với nhau. Đầu tiên, đặt các dòng này trong .bash_profile của bạn:
export PROMPT_COMMAND='export TRIM=`~/bin/trim.pl`'
export PS1="\[\e]0;\$TRIM\a\]\$TRIM> "
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
Tôi đã xem qua và viết hàng chục đoạn về cách thức hoạt động của tất cả những điều này và chính xác lý do tại sao nó được thiết lập theo cách của nó, nhưng bạn không thực sự quan tâm. Tin tôi đi Có cả một chương của một cuốn sách tại sao tôi lại làm "CMD =...
; echo ..." trên dòng thứ ba đó. Nhiều người (bao gồm cả bluehost, nơi tên miền khác của tôi được lưu trữ) vẫn đang sử dụng và phiên bản bash cũ với các lỗi lớn trong cách xử lý bẫy, vì vậy chúng tôi bị mắc kẹt với điều này. Bạn có thể xóa CMD và thay thế nó bằng $ BASH_COMMAND nếu bạn có mặt trên phiên bản bash của bạn và cảm thấy muốn thực hiện nghiên cứu.
Dù sao, kịch bản đầu tiên tôi sử dụng là ở đây. Nó tạo ra một dấu nhắc đẹp có chứa tên máy và thư mục của bạn, được cắt nhỏ theo chiều dài hợp lý:
============trim.pl===========
#!/usr/bin/perl
#It seems that my cygwin box doesn't have HOSTNAME available in the
#environment - at least not to scripts - so I'm getting it elsewhere.
open (IN, "/usr/bin/hostname|");
$hostname = <IN>;
close (IN);
$hostname =~ /^([A-Za-z0-9-]*)/;
$host_short = $1;
$preamble = "..." if (length($ENV{"PWD"})>37);
$ENV{"PWD"} =~ /(.{1,37}$)/;
$path_short = $1;
print "$host_short: $preamble$path_short";
==============================
Có một cảnh báo ở đầu bài đăng blog này mà bạn nên đọc ngay trước khi bắt đầu hỏi những câu ngu ngốc như "Tại sao bạn không sử dụng biến môi trường HOSTNAME thông qua @ENV?" Đơn giản: Bởi vì nó không hoạt động cho tất cả các hệ thống tôi đã thử.
Bây giờ cho bit thực sự mát mẻ. Ghi nhớ dòng 3 của phần bổ sung .bash_profile?
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
Nó đang bỏ đầu ra tập lệnh trim.pl trong cùng một thùng chứa như trước đây, in ra cả dấu nhắc lệnh và tiêu đề cửa sổ, nhưng lần này là thêm lệnh mà bạn vừa gõ! Đây là lý do tại sao bạn không muốn thực hiện tất cả những điều này trong .bashrc: bất kỳ tập lệnh nào bạn chạy (trên máy của tôi, người đàn ông là một trong số họ) sẽ kích hoạt điều này trên mỗi dòng. đầu ra của con người bị cắt xén nghiêm trọng bởi những gì chúng ta đang làm ở đây. Chúng tôi không chính xác chơi tốt với thiết bị đầu cuối.
Để lấy lệnh bạn vừa gõ, chúng tôi lấy lịch sử của bash và đưa nó lên một chút:
===========hist.pl============
#!/usr/bin/perl
while (<STDIN>)
{
$line = $_
}
chomp $line;
$line =~ /^.{27}(.*)/;
print $1;
==============================
Vì vậy, bây giờ, tôi có một cửa sổ lớn và họ nói những điều như:
castro: /home/ronb blog
Ron-D630: /C/ronb/rails/depot script/server
Ron-D630: /C/ronb/rails/depot mysql -u ron -p
Ron-D630: /C/ronb/rails/depot find . > /C/ronb/system.map
Ron-D630: /C/ronb/rails/depot vi app/views/cart.html.erb
Ron-D630: /C/perforce/depot/ p4 protect
Ron-D630: /C/perforce/depot/ p4 sync -f
Ron-D630: /C/perforce/depot/
Từ thanh nhỏ hạnh phúc ở dưới cùng của màn hình, bây giờ tôi có thể biết đó là cái gì trong nháy mắt. Và bởi vì chúng ta đã thiết lập PS1, ngay sau khi một lệnh kết thúc thực thi, tên lệnh được thay thế bằng đầu ra của trim.pl một lần nữa.
CẬP NHẬT (cùng ngày): Nội dung này (các mục .bash_profile) đã tạo ra tất cả các loại địa ngục đối với tôi khi tôi thử nó trong .bashrc của tôi. .Bashrc của bạn được thực thi bởi các tập lệnh không tương tác bất cứ khi nào bạn gọi bash làm ngôn ngữ. Tôi đánh nó khi tôi đang cố gắng sử dụng người đàn ông. Tất cả các loại rác (văn bản đầy đủ của .bashrc của tôi, cộng với các nhà từ thiện thoát hiểm) xuất hiện ở đầu trang của người đàn ông. Tôi sẽ đề nghị thử nghiệm viên ngọc này bằng một lời mời 'man man' nhanh chóng trong dòng lệnh một khi bạn kết hợp tất cả lại với nhau.
Tôi đoán đã đến lúc tôi rút rác tùy chỉnh ra khỏi .bashrc của mình và đặt nó ở nơi ...
Ngẫu nhiên, tôi thấy mình gõ 'bẫy người đàn ông' tại một thời điểm trong quá trình này.