BASH mendukung $PROMPT_COMMAND
variabel lingkungan yang mendefinisikan perintah yang akan dieksekusi sebelum prompt interaktif tingkat pertama. Saya mencari kesetaraan ZSH itu.
Dokumentasi mengatakan bahwa ada fungsi yang precmd
bisa saya definisikan untuk mencapai itu; Namun, saya tidak tahu bagaimana cara mendefinisikannya dari variabel lingkungan.
Saya telah mempertimbangkan untuk mengirimkan variabel lingkungan yang akan membuat ZSH membaca file yang berisi definisi fungsi itu, tetapi ZSH tampaknya tidak mendukung hal-hal seperti itu : ia hanya membaca file global dan kemudian file per-pengguna. Saya bisa menggantinya tetapi saya tidak bisa menambahkannya tanpa memodifikasi file, yang tidak bisa saya lakukan.
Jadi, bagaimana saya mendefinisikan kait pre-prompt di ZSH melalui variabel lingkungan, seperti yang saya lakukan menggunakan $PROMPT_COMMAND
di BASH?
sumber
exit
danexec
, ok;)
)start() { eval "$@"; echo post-command-code }
dan kemudian gunakan zle-binding untuk mengeksekusi baris perintah denganstart
prepended?DEBUG
perangkap adalah nice menemukan, tetapi Anda masih memiliki masalah bagaimana mendefinisikannya. Saya telah memperpanjang jawaban saya sekali lagi, tetapi saya menyerahkan kepada Anda untuk menuliskan jawaban Anda sendiri mengenai solusi perangkap DEBUG.:)
Jawaban:
Pendekatan paling sederhana untuk meniru bash
$PROMPT_COMMAND
yang muncul di pikiran saya adalah menggunakanprecmd
hook, seperti yang sudah Anda ketahui. Tentukan sebagaidan Anda dapat melakukan sesuatu seperti itu:
Harap perhatikan tanda kutip tunggal dalam contoh itu, jika tidak
$(date)
akan diperluas terlalu dini, yaitu sudah ketika mendefinisikan$PROMPT_COMMAND
dan tidak ketika dipanggil sebelum prompt.Jika Anda ingin mempertahankan (dan tidak ingin mengubah) definisi yang ada, Anda dapat menggunakan pendekatan itu:
Dengan itu
prmptcmd
fungsi dieksekusi setelahprecmd()
fungsi yang ada .Akhirnya, berikut adalah cara yang cocok untuk digunakan dalam paket program, yang tidak boleh memodifikasi file pengguna atau sistem atau memasukkan perintah interaktif.
Contoh untuk menelurkan sesi bash bisa jadi
Untuk menelurkan zsh bisa Anda gunakan
yang menyebabkan
/program/dir/.zshrc
bersumber. Dalam file ini,precmd()
pengait dapat didefinisikan seperti dijelaskan di atas. Jika Anda ingin pengaturan pengguna selain sertakansource $HOME/.zshrc
dll di .zshrc program, juga. Pengaturan ini dapat dipertahankan, karena tidak ada file di luar direktori program yang dimodifikasi.Sebagai tambahan terakhir, berikut ini adalah bukti konsep bagaimana membuat pengguna baru tetap selamat datang juga. Gunakan kode berikut dalam
/program/dir/.zshenv
file konfigurasi rc Anda :sumber
.zshrc
? (3) Contoh:foo() { echo foo }; bar() { echo bar }; precmd_functions=(foo bar)
ini mengeksekusifoo()
danbar()
di samping untukprecmd()
.PROMPT_COMMAND="echo foo" bash
, kan? Adalah ini kemungkinan untuk pemijahan zsh:ZDOTDIR=/program/dir zsh
. Kemudian/program/dir/.zshrc
diperoleh dari awal di mana Anda dapat mendefinisikan kait precmd (). Jika Anda ingin pengguna, sertakan,source $HOME/.zshrc
dll. Di zshrc program. Ini harus mudah dipelihara, karena tidak ada file di luar dir program yang dimodifikasi.Seperti yang dinyatakan oleh @mypy, Zsh
precmd
bekerja mirip dengan BashPROMPT_COMMAND
.Berikut ini contoh yang berfungsi untuk Bash atau Zsh dan tidak digunakan
eval
:Jalankan dari skrip init shell:
dan:
Prompt di sini hanyalah contoh. Seseorang pasti dapat melakukan banyak hal yang lebih rumit.
Untuk detail pengaturan fungsi prompt, lihat: http://zsh.sourceforge.net/Doc/Release/Functions.html#index-precmd dan http://www.gnu.org/software/bash/manual/bashref.html # Pencetakan-Prompt .
Untuk detail ekspansi cepat, lihat http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html dan http://www.gnu.org/software/bash/manual/bashref.html#Printing-a -Prompt .
sumber