Apakah mungkin subkulit untuk mengeksekusi sesuatu di shell induk?

Aug 20 2020

Saya memiliki skrip shell yang harus sourced, karena tujuannya adalah untuk mengatur sekumpulan variabel lingkungan di lingkungan saat ini.

Jika masa depan saya lupa, skrip dimulai dengan:

#!/usr/bin/env bash

mustBeSourced() {
  >&2 echo "This script must be sourced."
  exit 1
}

(return 0 2>/dev/null) || mustBeSourced

Saya sering menghadapi situasi ini, karena banyak skrip yang saya gunakan secara teratur. Saya ingin membebaskan diri dari kebutuhan untuk mengingat skrip mana yang perlu saya dapatkan, serta momen-momen kecil ketika saya lupa.

Apakah ada cara bagi skrip untuk, daripada memberi tahu pengguna untuk membuat sumber skrip, memberi tahu shell pemanggil untuk memberi sumber skrip?

Shell panggilan saya biasanya zsh, tetapi saya akan menerima solusi yang kompatibel dengan bash atau dash jika tidak memungkinkan dengan zsh. Skrip saat ini ditulis sebagai skrip bash, tetapi saya tidak memiliki masalah mengubahnya ke shell lain (atau bahasa yang kompatibel dengan shebang non-shell) jika dapat mencapai apa yang saya inginkan.

Saya punya firasat bahwa ini tidak mungkin, setidaknya bukan tanpa beberapa kejahatan serius.

Jawaban

2 StéphaneChazelas Aug 21 2020 at 00:28

Dengan zsh, Anda dapat menggunakan alias sufiks (lihat info zsh aliasuntuk detailnya)

alias -s zshenv=source

Untuk memastikan bahwa saat Anda memanggil some-file.zshenv, source some-file.zshenvdijalankan sebagai gantinya.

Memiliki kode injeksi yang dapat dieksekusi ke dalam proses induknya dapat dicapai dengan menggunakan debugger, tetapi Anda tidak ingin pergi ke sana.