Ini, dari posting di blog saya beberapa bulan yang lalu, telah berubah dari gagasan yang saya pikir keren untuk salah satu peretasan kecil terbaik yang saya batuk dalam memori baru-baru ini. Saya mengutipnya secara lengkap di sini:
==================
Saya menghabiskan banyak waktu di bash. Untuk yang belum tahu, bash adalah sistem yang akan Anda temukan di sebagian besar mesin unix dan, untungnya, beberapa jendela dan setiap Mac di luar sana. Pada blush on pertama, itu tidak lebih dari antarmuka baris perintah, dan karena itu dari radar sebagian besar pengguna yang melihat hal-hal seperti anakronisme yang mereka lebih suka lupa.
Saya melakukan hampir semuanya dalam bash. SAYA BACA EMAIL SAYA DARI LINE PERINTAH, itulah sebabnya saya menghindari email yang ditandai. Saya menavigasi direktori, mengedit file, terlibat dalam checkout dan pengiriman kode sumber harian saya, mencari file, mencari di dalam file, me-reboot mesin saya, dan bahkan kadang-kadang menelusuri halaman web dari baris perintah. bash adalah jantung dan jiwa dari keberadaan digital saya.
Masalahnya adalah saya cenderung memiliki sekitar 6 jendela terbuka pada suatu waktu. Di tempat kerja hari ini, saya punya satu yang menjalankan server web, yang lain mengutak-atik basis data saya, yang ketiga, keempat, dan kelima mengedit file yang berbeda, sementara yang keenam sedang mencari-cari di mesin saya mencoba untuk merekam nama-nama setiap file pada sistem. Mengapa? Karena itu berguna untuk dapat mencari melalui arsip seperti itu jika Anda ingin tahu di mana menemukan objek dengan nama file.
Ketika Anda melakukan ini, Anda berakhir dengan banyak jendela di bilah kontrol Anda dengan nama sederhana, "bash." Ini baik-baik saja jika Anda hanya memiliki satu dari mereka, tetapi penderitaannya ketika Anda memiliki 6 atau lebih .... dan dua lusin hal lain terjadi. Saya memiliki tiga monitor di bawah perintah simultan dari satu pasangan keyboard / mouse dan saya masih merasa perlu untuk lebih. Masing-masing windows memiliki beberapa terminal bash terbuka.
Jadi saya telah mencelupkan ini bersama. Pertama, tempatkan baris ini di .bash_profile Anda:
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
Saya telah meneliti dan menulis lusinan paragraf tentang bagaimana semua ini bekerja dan mengapa itu diatur sebagaimana mestinya, tetapi Anda tidak benar-benar tertarik. Percayalah kepadaku. Ada seluruh bab buku tentang mengapa saya melakukan "CMD = ...
; echo ..." di baris ketiga itu. Banyak orang (termasuk bluehost, tempat domain saya lainnya dihosting) masih menggunakan dan versi lama dari bash dengan bug utama dalam cara menangani jebakan, jadi kami terjebak dengan ini. Anda dapat menghapus CMD dan menggantinya dengan $ BASH_COMMAND jika Anda saat ini pada versi bash Anda dan merasa ingin melakukan penelitian.
Bagaimanapun, skrip pertama yang saya gunakan ada di sini. Ini menciptakan prompt yang bagus yang berisi nama dan direktori mesin Anda, dipotong dengan panjang yang masuk akal:
============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";
==============================
Ada peringatan di bagian atas posting blog ini yang harus Anda baca sekarang sebelum mulai mengajukan pertanyaan bodoh seperti, "Mengapa Anda tidak menggunakan variabel lingkungan HOSTNAME melalui @ENV?" Sederhana: Karena itu tidak berfungsi untuk semua sistem yang saya coba.
Sekarang untuk bagian yang sangat keren. Ingat baris 3 dari penambahan .bash_profile?
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
Ini membuang hasil skrip trim.pl dalam wadah yang sama seperti sebelumnya, mencetak ke prompt perintah dan judul jendela, tapi kali ini menambahkan perintah yang baru saja Anda ketik! Inilah sebabnya mengapa Anda tidak ingin melakukan semua ini di .bashrc: skrip apa pun yang Anda jalankan (di komputer saya, man adalah salah satunya) akan memicu hal ini di setiap baris. hasil manusia menjadi kacau serius oleh apa yang kita lakukan di sini. Kami tidak benar-benar bermain baik dengan terminal.
Untuk mengambil perintah yang baru saja Anda ketik, kami mengambil sejarah bash dan memotongnya sedikit:
===========hist.pl============
#!/usr/bin/perl
while (<STDIN>)
{
$line = $_
}
chomp $line;
$line =~ /^.{27}(.*)/;
print $1;
==============================
Jadi sekarang, saya memiliki bazillion windows dan mereka mengatakan hal-hal seperti:
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/
Dari bilah kecil yang bahagia di bagian bawah layar, sekarang saya bisa tahu mana yang sekilas. Dan karena kami telah menetapkan PS1, segera setelah perintah selesai dijalankan, nama perintah diganti dengan hanya output dari trim.pl lagi.
UPDATE (hari yang sama): Hal-hal ini (entri .bash_profile) meletakkan semua jenis neraka pada saya ketika saya mencobanya di .bashrc saya. .Bashrc Anda dijalankan oleh skrip non-interaktif setiap kali Anda memanggil bash sebagai bahasa. Saya memukul ini ketika saya mencoba menggunakan pria. Semua jenis sampah (teks lengkap .bashrc saya, plus charecters melarikan diri) muncul di bagian atas halaman manual. Saya akan menyarankan untuk menguji permata ini dengan doa cepat 'man man' di baris perintah setelah Anda mengumpulkan semuanya.
Saya kira sudah waktunya bagi saya untuk mengeluarkan sampah kustom dari .bashrc saya dan meletakkannya di tempatnya ...
Secara paksa, saya menemukan diri saya mengetik 'man trap' pada satu titik dalam proses ini.