Chia sẻ các biến môi trường giữa bash và cá


13

bash và fish script không tương thích, nhưng tôi muốn có một tệp xác định một số biến môi trường sẽ được khởi tạo bởi cả bash và fish.

Giải pháp đề xuất của tôi là xác định một ~/.envtệp chứa danh sách các biến môi trường như vậy:

PATH="$HOME/bin:$PATH"
FOO="bar"

Sau đó tôi có thể chỉ cần nguồn nó trong bash và tạo một kịch bản chuyển đổi nó thành định dạng cá và các nguồn trong cá.

Tôi đã nghĩ rằng có thể có một giải pháp tốt hơn thế này, vì vậy tôi đang yêu cầu cách chia sẻ các biến môi trường tốt hơn giữa cá bash.

Lưu ý: Tôi đang sử dụng OS X.


Dưới đây là một .envtệp ví dụ mà tôi muốn cả cá và bash xử lý bằng cú pháp của cá lố bịch (giả sử ~ / bin và ~ / bin2 là các thư mục trống):

setenv _PATH "$PATH"
setenv PATH "$HOME/bin"
setenv PATH "$PATH:$HOME/bin2"
setenv PATH "$PATH:$_PATH"

Câu trả lời:


16

bash có cú pháp đặc biệt để thiết lập các biến môi trường, trong khi cá sử dụng hàm dựng sẵn. Tôi sẽ đề nghị viết tập tin .env của bạn như vậy:

setenv VAR1 val1
setenv VAR2 val2

và sau đó xác định setenvmột cách thích hợp trong các vỏ tương ứng. Trong bash (ví dụ: .bashrc):

function setenv() { export "$1=$2"; }
. ~/.env

Trong cá (ví dụ: config.fish):

function setenv; set -gx $argv; end
source ~/.env

Lưu ý rằng PATH sẽ yêu cầu một số xử lý đặc biệt, vì đó là một mảng trong cá nhưng là một chuỗi phân cách bằng dấu hai chấm trong bash. Nếu bạn thích viết setenv PATH "$HOME/bin:$PATH"bằng .env, bạn có thể viết setenv của cá như vậy:

function setenv
    if [ $argv[1] = PATH ]
        # Replace colons and spaces with newlines
        set -gx PATH (echo $argv[2] | tr ': ' \n)
    else
        set -gx $argv
    end
 end

Điều này sẽ xử lý sai các phần tử trong PATH có chứa khoảng trắng, dấu hai chấm hoặc dòng mới.

Sự lúng túng trong PATH là do trộn các chuỗi phân cách bằng dấu hai chấm với các mảng thực sự. Cách ưa thích để nối với PATH trong cá là đơn giản set PATH $PATH ~/bin.


1
Liệu PATHsửa chữa cho cá làm việc với các đường dẫn với: không gian? dòng mới? những thứ khác để tìm kiếm?
Tyilo

[là một nội dung tích hợp trong cả bash và cá, vì vậy không cần phải đặt đúng PATH để sử dụng [. Mẫu setenv sẽ hoạt động với tất cả các ký tự trong PATH ngoại trừ dấu hai chấm và dòng mới.
lố

Thay thế trbằng /usr/bin/trI và sử dụng .envtệp được cung cấp trong câu hỏi của tôi, tôi gặp rất nhiều lỗi khi bắt đầu câu cá. Tôi không nghĩ rằng việc xử lý PATH là chính xác.
Tyilo

Oh, phải, cá sẽ tách không gian bên trong dấu ngoặc kép. Tôi sẽ cập nhật bình luận.
nực

Yay nó hoạt động bây giờ. Tôi không nghĩ rằng bất kỳ vỏ nào khác (ngoại trừ cá?) Cho phép đường dẫn với dấu hai chấm trong PATH.
Tyilo

6

Có (bây giờ?) Một cách dễ dàng hơn, theo câu trả lời của @ Zanchey tại đây

Fish Shell: Cách đặt nhiều biến môi trường từ một tệp bằng cách xuất

Thông báo tiêu hóa là:

Cá:

echo -e "foo=3\nfoobar=4" > .env; export (cat .env); env | grep foo

Bash:

echo -e "foo=3\nfoobar=4" > .env; export $(cat .env | xargs); env | grep foo

với sự khác biệt $và việc sử dụngxargs


Nhiều thuận tiện hơn và không có bất kỳ cú pháp đặc biệt. Cảm ơn bạn
Panayotis

Không hoạt động cho các mảng như $ PATH
JanKanis

5

Hầu hết các hệ thống Unix đều sử dụng PAM . Các pam_envmô-đun đọc một tập tin rất giống như của bạn .env.

Trên Linux , pam_envđọc tệp hệ thống /etc/environmentvà tệp người dùng ~/.pam_environment. Trên OS X (và * BSD khác, sử dụng OpenPAM), có vẻ như pam_envchỉ đọc tệp hệ thống, do đó bạn không thể đặt biến cho mỗi người dùng theo cách này, chỉ cho tất cả người dùng.


1

Mở rộng trên câu trả lời của @ Ridicquil_fish, với chức năng sau cho bash, nó cũng hoạt động cho các mảng có chứa khoảng trắng, chẳng hạn như $PATHnếu bạn có khoảng trắng trong đường dẫn của mình. Tuy nhiên ngày setenvnay đã được định nghĩa là một chức năng trong thư viện tiêu chuẩn cá nên tôi đã đổi tên ở đây thànhshenv

function shenv { 
        var="$1"
        shift
        export "$var=$(printf "%s\n" "$@" | paste -s -d: -)"
}
. ~/.env

Bây giờ trong .envtệp của bạn, bạn có thể chỉ định các thành phần mảng dưới dạng các đối số riêng biệt cho setenvlệnh:

shenv PATH /my/path /my/path\ with\ spaces "/my/quoted path" $PATH

Đối với việc thực hiện đơn giản của cá @ Ridicificent_fish sẽ làm:

function shenv; set -gx $argv; end
source ~/.env

1

Chỉ cần tạo một hàm trong $ HOME / .config / fish / tests / env.fish với nội dung:

for f in /etc/profile.d/*.sh
    sh $f
end

đã chia sẻ tất cả các vars được tạo trong bash trong thư mục /etc/profile.d

ví dụ: /etc/profile.d/golang.sh

#!/bin/sh
export GOPATH=$HOME/gopath
export GOROOT=$HOME/go
export GOBIN=$HOME/gobin

export PATH=$PATH:$GOROOT/bin:$GOBIN

chỉ cần đăng nhập vào cá hoặc bash, làm echo $GOPATH $GOROOT $GOBIN $PATHvà xem phép thuật :)

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.