membersihkan semua variabel tanpa menutup terminal

10

Saya ingin tahu cara menghapus semua variabel yang saya definisikan di command prompt tanpa menutup terminal?

misalnya, jika saya menetapkan variabel pada command prompt sebagai:

$ a=1

sekarang saya ingin menghapus variabel $a(dan banyak variabel lain yang didefinisikan dengan cara yang sama) tanpa menutup terminal. Saya bisa menggunakan unsettetapi akan menjadi sibuk jika tidak ada yang besar. variabel

Edward Torvalds
sumber
2
exec "$0"mungkin - tetapi sulit untuk mengatakan apa yang Anda maksud dengan global .
mikeserv
3
Mengapa Anda ingin melakukan itu?
Hauke ​​Laging
1
@ HaukeLaging Saya bekerja dengan array menggunakan skrip. Saya terkadang menambahkan satu elemen ke dalamnya. karena itu saya tidak bisa menjalankan skrip dengan nilai-nilai lama (karena array diubah). saya harus menutup terminal dan memulai sesi baru lagi. Saya harap saya menjelaskan. jika tidak tolong beri tahu saya :)
Edward Torvalds
1
@uru - ia mendapat daftar yang disimpan ke $vardengan var=$(declare -p +F);kemudian meneruskannya sebagai argumen ke fungsi yang echo "${2%%=*}".menjawabnya. Ada beberapa masalah dengan ukuran belaka - tetapi itu akan berfungsi jika lingkungan Anda tidak besar.
mikeserv
3
Saya tidak tahu apa yang Anda coba lakukan. Apakah Anda berbicara tentang shell interaktif atau skrip? Variabel yang diatur dalam skrip yang dieksekusi dari shell interaktif tidak mempengaruhi shell induk. Beri tahu kami apa yang ingin Anda capai, bukan jalan buntu yang Anda kejar .
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

9

Jika Anda melakukannya (GNU coreutils)

exec env --ignore-environment /bin/bash

Anda akan menggunakan lingkungan yang baru & segar

Gilles Quenot
sumber
bagaimana exec "$0"?
Edward Torvalds
@edwardtorvalds $0adalah argumen nol ke shell yang dieksekusi. Jadi, jika Anda menjalankan bash $0adalah bash (mungkin - mungkin -bashdalam -lkasus ogin shell tergantung pada versi) . Jika Anda menjalankan skrip dengan #!/bin/bashbangline, $0adalah jalur menuju skrip. exec "$0"mungkin lebih fleksibel, tetapi exec bashlebih eksplisit. Jika Anda memasukkan perintah itu di terminal, bashharus mengenali itu dalam lingkungan interaktif dan melakukan yang setara bash -i- yang akan ~/.bashrcmenjalankan file Anda juga.
mikeserv
Ini tidak membantu export a=123, variabel itu diwarisi ...
merangsang
1

Anda dapat menggunakan env, yang disediakan oleh GNU coreutils (biasanya sudah diinstal pada sistem GNU / Linux):

exec env --ignore-environment /bin/bash

Panggilan sistem exec adalah agar proses Anda saat ini digantikan di tempat oleh versi baru dari shell yang kurang ramah lingkungan.

Ini bermanfaat untuk juga menghapus variabel lingkungan yang diekspor .

pengguna30747
sumber
Tapi ini akan menghapus variabel PATH saya yang dimodifikasi, misalnya export PATH=$PATH:~/foo, kan?
Edward Torvalds
Kamu benar. Saya telah memodifikasi jawaban saya sehingga jalur absolut dari shell digunakan alih-alih $ 0.
user30747
Terima kasih kepada user30747, mencuri jawaban Anda untuk mengoreksi jawaban saya. Tidak dapat menghapus jawaban yang diterima
Gilles Quenot