2014-11-26 13 views
8

Bạn có thể trivially sản lượng môi trường của bạn như một kịch bản shell Runnable sử dụngLàm thế nào để env đầu ra như một kịch bản shell Runnable

env > my_env 

... sau này trong kịch bản khác ...

set -a 
source my_env 

này hoạt động cho các trường hợp tầm thường nhất, nhưng không thành công nếu có bất kỳ ký tự đặc biệt hoặc dấu cách nào trong env.

Tôi làm cách nào để khắc phục tập lệnh trên để nó hoạt động với các nội dung như a='"'"'"?

+1

Chạy kịch bản mà không làm rất nhiều, tuy nhiên, cho là càng sớm càng hoàn thành công việc chạy nó thoát, và không làm thay đổi môi trường mẹ của một chút. 'source my_env' có ý nghĩa hơn, nhưng không yêu cầu' chmod + x'. –

+0

điểm tốt loại bỏ các + x là tiếng ồn của nó –

Trả lời

4

Sử dụng set thay vì env:

○ → set | grep LESS 
LESS=-R 
LESSCLOSE='/usr/bin/lesspipe %s %s' 
LESSOPEN='| /usr/bin/lesspipe %s' 

○ → env | grep LESS 
LESS=-R 
LESSOPEN=| /usr/bin/lesspipe %s 
LESSCLOSE=/usr/bin/lesspipe %s %s 

Nhờ this similar question chúng ta có thể làm điều này để có được các biến JUST môi trường như sau:

○ → (set -o posix; set) | grep LESS 
LESS=-R 
LESSCLOSE='/usr/bin/lesspipe %s %s' 
LESSOPEN='| /usr/bin/lesspipe %s' 

Hãy thử khổng lồ này mà nên in chỉ sự khác biệt từ một vỏ "nguyên sơ". YMMV:

diff --old-line-format='%L' --unchanged-line-format= --new-line-format= \ 
    <(bash -c 'set -o posix; set' | sort) \ 
    <(env -i bash -c 'set -o posix; set' | sort) 
4

Sử dụng sau đây bash's printf %q để thoát khỏi giá trị chính xác bất kể nội dung của chúng. Nó được đảm bảo để xử lý theo nghĩa đen mọi giá trị có thể - dấu ngoặc kép, dòng mới, v.v., miễn là hệ điều hành được sử dụng hỗ trợ cơ sở /proc/self/environ đầu tiên được cung cấp bởi Linux để phát ra nội dung của môi trường dưới dạng luồng được phân tách bằng NUL. Nó sử dụng các hình thức trích dẫn đặc biệt như $'\n' và khi thích hợp, do đó đầu ra của nó có thể không được các trình thông dịch POSIX tinh khiết tôn trọng.

#!/usr/bin/env bash 
while IFS= read -r -d '' kvname; do 
    k=${kvname%%=*} 
    v=${kvname#*=} 
    printf '%q=%q\n' "$k" "$v" 
done </proc/self/environ 

Lưu ý rằng bạn sẽ muốn nguồn sản lượng, không chạy nó như một thực thi bên ngoài, nếu bạn muốn môi trường shell hiện tại của bạn để thay đổi. Nếu bạn không muốn set -a trước khi tìm nguồn cung ứng, hãy thêm export hàng đầu vào chuỗi định dạng.

+0

Tôi chỉ cố gắng ra (set -o posix; xuất khẩu) và nó có vẻ như làm các trick là tốt, là điều này sẽ phát nổ trên tôi? –

+0

Tôi nghi ngờ bạn cần 'set -o posix' ở đó, thực sự; 'xuất khẩu' một mình có lẽ là tốt. Một điều mà mã trên làm tốt hơn so với các giải pháp dựa trên vỏ nguyên gốc là phơi bày các biến môi trường * không * cũng là các biến hệ vỏ hợp lệ (ví dụ, khi được thiết lập bởi các ngôn ngữ không phải vỏ với các tên không phải là tên hợp pháp), nhưng cách cư xử đó là ... biến đổi rất cao dù sao đi nữa. –

+1

@SamSaffron, ... cho biết, đọc tài liệu về 'xuất' (hoặc, nếu bạn muốn rõ ràng hơn,' xuất -p'), tôi không thấy nó _guaranteeing_ rằng đầu ra của nó là an toàn. 'printf '% q'' * đảm bảo * an toàn. Mặt khác, dựa vào '/ proc' được đảm bảo để giảm tính di động của bạn, vì vậy phương pháp này chắc chắn có những cạm bẫy, và việc triển khai trong các phiên bản bash tôi đang xem có vẻ hoàn toàn an toàn mặc dù không đảm bảo điều này trong tài liệu . –

3

giải pháp đơn giản nhất có vẻ là

export -p > my_env 
Các vấn đề liên quan