Bisakah saya menelurkan terminal baru yang merupakan klon dari terminal saat ini?

8

Jadi katakanlah saya sedang mengembangkan kode di direktori / asdf / qwer / dfgh / wert / asdf / qwer dan saya telah menambahkan sekitar tiga direktori seperti itu ke jalur saya dan saya memiliki banyak variabel lingkungan lingkungan misterius yang ditetapkan. Kemudian saya menyadari bahwa saya benar-benar membutuhkan terminal lain terbuka dan diatur dengan cara yang sama (walaupun kebutuhan ini tidak terulang sehingga saya hanya akan mengubah .bashrc saya). Apakah ada perintah untuk membuka jendela terminal baru yang merupakan klon yang persis sama?

John Berryman
sumber

Jawaban:

10

Mengkloning jalurnya mudah jika Anda dapat menjalankan program terminal dari baris perintah. Dengan asumsi Anda menggunakan xterm, jalankan saja xterm &dari prompt terminal yang ingin Anda tiru. Xterm baru akan mulai di direktori yang sama, kecuali Anda sudah mengonfigurasi untuk memulai sebagai shell login. Setiap variabel lingkungan yang diekspor juga akan terbawa, tetapi variabel yang tidak diekspor tidak akan.

Cara cepat dan kotor untuk mengkloning seluruh lingkungan (termasuk variabel yang tidak diekspor) adalah sebagai berikut:

# from the old shell:
set >~/environment.tmp

# from the new shell:
. ~/environment.tmp
rm ~/environment.tmp

Jika Anda telah mengatur opsi shell khusus, Anda harus menerapkannya kembali juga.

Anda bisa membungkus seluruh proses ini menjadi skrip yang mudah dijalankan. Biarkan skrip menyimpan lingkungan ke file yang diketahui, lalu jalankan xterm. Minta .bashrc Anda memeriksa file itu, dan sumber dan hapus jika ditemukan.


Sebagai alternatif, jika Anda tidak ingin memulai satu terminal dari yang lain, atau hanya ingin lebih banyak kontrol, Anda bisa menggunakan sepasang fungsi yang Anda tentukan di .bashrc:

putstate () {
    declare +x >~/environment.tmp
    declare -x >>~/environment.tmp
    echo cd "$PWD" >>~/environment.tmp
}

getstate () {
    . ~/environment.tmp
}

EDIT : Berubah putstatesehingga menyalin status "diekspor" dari variabel shell, sehingga cocok dengan metode lainnya. Ada hal-hal lain yang dapat disalin juga, seperti opsi shell (lihat help set) - sehingga ada ruang untuk perbaikan dalam skrip ini.

Jander
sumber
Wow ... penjelasan keren yang mengarah pada beberapa wawasan yang saya miliki sebelumnya.
John Berryman
Saya memodifikasi skrip Anda untuk mengambil argumen dan menempatkan put dan mendapatkan lingkungan ke file bernama oleh argumen ... sekarang saya dapat memiliki beberapa lingkungan! : D
John Berryman
Pertanyaan: apa artinya "." lakukan di getstate?
John Berryman
"." mengatakan, "Jalankan isi file ini menggunakan shell saat ini, seolah-olah mereka diketik di baris perintah". Tanpa ".", Salinan baru bashakan menjalankan perintah dalam file dan kemudian keluar, dan lingkungan shell saat ini tidak akan berubah.
Jander
0

Jika Anda memulai screen(Layar GNU) di lingkungan yang Anda tentukan, lingkungan itu akan digunakan oleh sub-proses (yaitu screen) dan Anda dapat menggunakannya untuk menelurkan terminal baru. Tetapi jika Anda ingin memotongnya lain kali (a screendalam screen) itu mulai rumit.

shellholic
sumber
0

Dalam situasi yang sama, saya juga menemukan manfaat untuk memulai shell baru di direktori yang sama dengan yang sekarang. Saya menggunakan resep seperti ini untuk memulai shell.

exec ssh -t $HOST "cd $DIR; $SHELL $parms"

Opsi -t diperlukan setiap kali Anda menjalankan shell secara eksplisit menggunakan ssh. Ini menyebabkan pseudo-tty dibuat untuk proses tersebut. Ini diperlukan agar perintah sejarah dan fitur interaktif lainnya berfungsi dengan benar. Baris sebelumnya dalam skrip mengatur DIR ke direktori saat ini dan SHELL ke shell yang disukai pengguna.

Chris Quenelle
sumber
0

sementara variabel yang diekspor membuatnya ke sisi lain menggunakan fungsi 'getstate' di atas, untuk beberapa alasan mereka akhirnya tidak diekspor di sana (seperti dapat dilihat menggunakan os.getenv sederhana dari python). tampaknya berfungsi lebih baik bagi saya ketika memodifikasi getstate menjadi alias:

alias getstate=". ~/environment.tmp"
srepmub
sumber