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


0

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

นี่คือตัวแปรทั้งหมดที่ฉันเพิ่มเข้ามาตั้งแต่ตอนที่เชลล์เริ่มต้นเช่นเมื่อทำ:

read abc
    123
# echo ${abc} => 123

หรือ

xyz='123'
# echo ${xyz} => 123

ฉันต้องการพิมพ์ทั้งหมดเพื่อทราบว่ามีการเพิ่มสิ่งใดในหน่วยความจำเพื่อให้ฉันสามารถล้างมันออกได้

คำตอบ:


2

หากคุณใช้ Bash คำสั่งนี้จะแสดงชื่อของตัวแปรเชลล์ทั้งหมดที่ไม่ได้รับการสืบทอดโดยกระบวนการลูกและไม่ใช่ส่วนหนึ่งของกระดานชนวนเริ่มต้น:

diff -U 1 <(set -o posix ; set |cut -d= -f1) <(exec bash -ic 'set -o posix ; set' | cut -d= -f1)|grep '^[-][^-]'|cut -d- -f2|grep -vE '^(COLUMNS|HISTFILESIZE|HISTSIZE|LINES|PIPESTATUS)$'

สิ่งนี้จะสร้างรายการชื่อตัวแปรทั้งหมดในเชลล์ปัจจุบัน (พร้อมset) และรายการชื่อตัวแปรทั้งหมดในกระบวนการย่อยที่สร้างขึ้นใหม่ซึ่งรันเชลล์เดียวกันค้นหาทั้งหมดที่มีอยู่ในรายการแรกไม่ใช่ที่สอง (พร้อมdiff) การตัดครั้งสุดท้ายและ grep ตัวแรก) และตัดค่าตัวแปรเริ่มต้นเฉพาะของ Bash ที่กระบวนการย่อยจะไม่มีเนื่องจากไม่ใช่เปลือกที่ผู้ใช้หันเข้าหา set -o posixทำsetรายการตัวแปรเท่านั้นและไม่ใช่ฟังก์ชั่น

มันจะละเว้นทั้งตัวแปรสภาพแวดล้อมที่สืบทอดและตัวแปรที่คุณทำเครื่องหมายเพื่อการส่งออกอย่างชัดเจน

สลับbashเปลือกของคุณ นอกจากนี้คุณยังจะต้องเปลี่ยนรายชื่อของตัวแปรละเลยในช่วงและอาจจะสูญเสียgrep set -o posixหากเชลล์ของคุณไม่มีการทดแทนกระบวนการคุณจะต้องใช้ไฟล์ชั่วคราวแทนหรือเข้าถึงเฉพาะตัวอธิบายไฟล์ (เช่น/dev/fd)


ในทางกลับกันหากสิ่งที่คุณต้องการทำคือลบตัวแปรและฟังก์ชั่นในตัวคุณออกไป

exec bash

จะมีผลกระทบนั้น (ในขณะที่อ่านไฟล์การกำหนดค่าบางไฟล์และอาจสูญเสียการเปลี่ยนแปลงในตัวเลือกเชลล์)


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