xóa tất cả các biến mà không đóng terminal


10

Tôi muốn biết làm thế nào để xóa tất cả các biến mà tôi đã xác định trong dấu nhắc lệnh mà không đóng terminal?

ví dụ: nếu tôi đặt một biến trong dấu nhắc lệnh là:

$ a=1

bây giờ tôi muốn xóa biến $a(và nhiều biến khác được định nghĩa theo cách tương tự) mà không đóng terminal. Tôi có thể sử dụng unsetnhưng nó sẽ rất bận rộn nếu không có lớn. của các biến


2
exec "$0"có thể - nhưng thật khó để nói ý của bạn trên toàn cầu .
mikeerv

3
Tại sao bạn muốn làm điều đó?
Hauke ​​Laging

1
@HaukeLaging Tôi đang làm việc với các mảng sử dụng tập lệnh. Đôi khi tôi thêm một yếu tố cho nó. do đó tôi không thể chạy tập lệnh với các giá trị cũ (vì mảng bị thay đổi). tôi phải đóng thiết bị đầu cuối và bắt đầu một phiên mới. Tôi hy vọng tôi đã làm rõ. nếu không xin vui lòng cho tôi biết :)
Edward Torvalds

1
@muru - anh ta nhận được một danh sách được lưu vào $varvar=$(declare -p +F);sau đó chuyển nó thành một đối số cho một hàm mà echo "${2%%=*}".câu trả lời đó có một vài vấn đề với kích thước tuyệt đối - nhưng nó sẽ hoạt động nếu môi trường của bạn không lớn.
mikeerv

3
Tôi không biết bạn đang cố gắng làm gì. Bạn đang nói về một vỏ tương tác hoặc một kịch bản? Các biến được đặt trong tập lệnh được thực thi từ trình bao tương tác không ảnh hưởng đến trình bao cha. Hãy cho chúng tôi những gì bạn muốn đạt được, không phải là mục đích mà bạn đang theo đuổi .
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


9

Nếu bạn làm (GNU coreutils)

exec env --ignore-environment /bin/bash

bạn sẽ sử dụng một môi trường mới và tươi mới


những gì về exec "$0"?
Edward Torvalds

@edwardtorvalds $0là đối số zeroth cho trình bao được thực thi. Vì vậy, nếu bạn đang chạy bash $0bash (có thể - nó có thể là -bashtrong một -ltrường hợp ogin vỏ tùy thuộc vào phiên bản) . Nếu bạn đang chạy một tập lệnh với một #!/bin/bashdòng chữ, $0là đường dẫn đến tập lệnh. exec "$0"có lẽ linh hoạt hơn, nhưng exec bashrõ ràng hơn. Nếu bạn nhập lệnh đó tại một thiết bị đầu cuối, bashsẽ nhận ra nó trong môi trường tương tác và thực hiện tương tự bash -i- sẽ giúp ~/.bashrctệp của bạn chạy tốt.
mikeerv

Điều này không giúp được gì export a=123, biến đó được kế thừa ...
kích thích

1

Bạn có thể sử dụng env, được cung cấp bởi GNU coreutils (thường được cài đặt sẵn trên các hệ thống GNU / Linux):

exec env --ignore-environment /bin/bash

Cuộc gọi hệ thống exec là để quy trình hiện tại của bạn được thay thế tại chỗ bằng phiên bản mới, không có môi trường của trình bao của bạn.

Điều này có lợi ích để xóa bất kỳ biến môi trường xuất khẩu .


Nhưng điều này sẽ xóa biến PATH đã sửa đổi của tôi, ví dụ export PATH=$PATH:~/foo, phải không?
Edward Torvalds

Bạn đúng rồi. Tôi đã sửa đổi câu trả lời của mình để đường dẫn tuyệt đối của vỏ được sử dụng thay vì $ 0.
dùng30747

Nhờ user30747, đánh cắp câu trả lời của bạn để sửa lỗi của tôi. Không thể xóa câu trả lời được chấp nhận
Gilles Quenot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.