ล้างตัวแปรทั้งหมดโดยไม่ปิดเทอร์มินัล


10

ฉันต้องการทราบวิธีล้างตัวแปรทั้งหมดที่ฉันกำหนดไว้ใน command prompt โดยไม่ปิดเทอร์มินัล

ตัวอย่างเช่นถ้าฉันตั้งค่าตัวแปรใน command prompt เป็น:

$ a=1

ตอนนี้ฉันต้องการลบตัวแปร$a(และตัวแปรอื่น ๆ อีกมากมายที่กำหนดในลักษณะที่คล้ายกัน) โดยไม่ต้องปิดสถานี ฉันสามารถใช้unsetแต่มันจะวุ่นวายถ้าไม่มีขนาดใหญ่ ของตัวแปร


2
exec "$0"บางที - แต่มันยากที่จะบอกสิ่งที่คุณหมายถึงทั่วโลก
mikeserv

3
ทำไมคุณต้องการทำเช่นนั้น?
Hauke ​​Laging

1
@HaukeLaging ฉันทำงานกับอาร์เรย์โดยใช้สคริปต์ บางครั้งฉันก็เพิ่มองค์ประกอบหนึ่งเข้าไป เพราะที่ฉันไม่สามารถเรียกใช้สคริปต์ด้วยค่าเก่า (ตั้งแต่เปลี่ยนอาร์เรย์) ฉันต้องปิดเครื่องและเริ่มเซสชันใหม่อีกครั้ง ฉันหวังว่าฉันชัดเจน หากไม่ได้โปรดแจ้งให้เราทราบ :)
เอ็ดเวิร์ด Torvalds

1
@muru - เขาได้รับรายการบันทึกไว้$varด้วยvar=$(declare -p +F);แล้วผ่านที่เป็นอาร์กิวเมนต์ฟังก์ชั่นที่ไม่หนึ่งecho "${2%%=*}".คำตอบที่มีปัญหาน้อยที่มีขนาดที่แท้จริง - แต่มันควรจะทำงานถ้าสภาพแวดล้อมของคุณไม่ได้เป็นอย่างมาก
mikeserv

3
ฉันไม่รู้ว่าคุณกำลังทำอะไรอยู่ คุณกำลังพูดถึงเปลือกโต้ตอบหรือสคริปต์? ตัวแปรที่ตั้งค่าในสคริปต์ที่เรียกใช้จากเชลล์แบบโต้ตอบไม่มีผลกับเชลล์หลัก บอกเราว่าคุณต้องการที่จะประสบความสำเร็จไม่ได้ซึ่งปลายตายคุณใฝ่หากำลัง
Gilles 'หยุดชั่วร้าย'

คำตอบ:


10

ถ้าคุณทำ (GNU coreutils)

exec env --ignore-environment /bin/bash

คุณจะใช้สภาพแวดล้อมที่สดใหม่


แล้วexec "$0"ไงล่ะ
Edward Torvalds

@edwardtorvalds $0เป็นอาร์กิวเมนต์ zeroth สำหรับเชลล์ที่ดำเนินการ ดังนั้นถ้าคุณกำลังทำงานbash $0เป็นbash (อาจจะ - มันอาจจะเป็น-bashใน-lกรณี ogin เปลือกขึ้นอยู่กับรุ่น) หากคุณกำลังเรียกใช้สคริปต์ที่มี#!/bin/bashbangline $0เป็นเส้นทางไปยังสคริปต์ exec "$0"อาจมีความยืดหยุ่นมากกว่า แต่exec bashชัดเจนกว่า หากคุณป้อนคำสั่งนั้นที่เทอร์มินัลbashควรรับรู้ว่าอยู่ในสภาพแวดล้อมแบบโต้ตอบและทำสิ่งที่เทียบเท่าbash -i- ซึ่งจะทำให้~/.bashrcไฟล์ของคุณทำงานเช่นกัน
mikeserv

สิ่งนี้ไม่ได้ช่วยexport a=123ตัวแปรนี้สืบทอดมา ...
กระตุ้น

1

คุณสามารถใช้envซึ่งให้บริการโดย GNU coreutils (โดยทั่วไปจะติดตั้งบนระบบ GNU / Linux):

exec env --ignore-environment /bin/bash

การเรียกใช้ระบบ exec คือเพื่อให้กระบวนการปัจจุบันของคุณถูกแทนที่ด้วยเชลล์เวอร์ชันใหม่ที่ไม่ใช้สภาวะแวดล้อม

สิ่งนี้มีประโยชน์ในการล้างตัวแปรสภาพแวดล้อมที่ส่งออกด้วย


แต่นี่จะล้างตัวแปร PATH ของฉันเช่นexport PATH=$PATH:~/fooใช่ไหม
Edward Torvalds

คุณพูดถูก ฉันได้แก้ไขคำตอบของฉันเพื่อที่จะใช้พา ธ สัมบูรณ์ของเชลล์แทน $ 0
30747

ขอบคุณ user30747 ขโมยคำตอบของคุณเพื่อแก้ไขของฉัน ไม่สามารถลบคำตอบที่ยอมรับได้
Gilles Quenot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.