แบ่งปันตัวแปรสภาพแวดล้อมระหว่างการทุบตีและปลา


13

สคริปต์ทุบตีและปลาเข้ากันไม่ได้ แต่ฉันต้องการไฟล์ที่กำหนดตัวแปรสภาพแวดล้อมบางอย่างที่จะเริ่มต้นได้โดยทั้งทุบตีและปลา

โซลูชันที่เสนอของฉันกำลังกำหนด~/.envไฟล์ที่จะมีรายการตัวแปรสภาพแวดล้อมเช่น:

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

จากนั้นฉันก็สามารถเขียนมันลงในทุบตีและสร้างสคริปต์ที่แปลงเป็นรูปแบบปลาและแหล่งที่มาในปลา

ฉันคิดว่าอาจมีทางออกที่ดีกว่านี้ดังนั้นฉันจึงขอวิธีที่ดีกว่าในการแบ่งปันตัวแปรสภาพแวดล้อมระหว่างปลาทุบตี

หมายเหตุ: ฉันใช้ OS X


นี่คือ.envไฟล์ตัวอย่างที่ฉันต้องการให้ทั้งปลาและทุบตีจัดการโดยใช้ไวยากรณ์ของปลาที่น่าขัน (สมมติว่า ~ / bin และ ~ / bin2 เป็นไดเรกทอรีว่าง):

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

คำตอบ:


17

bash มีไวยากรณ์พิเศษสำหรับการตั้งค่าตัวแปรสภาพแวดล้อมในขณะที่ปลาใช้ builtin ฉันขอแนะนำให้เขียนไฟล์. env เช่น:

setenv VAR1 val1
setenv VAR2 val2

แล้วกำหนดsetenvอย่างเหมาะสมในแต่ละกระสุน ใน bash (เช่น. bashrc):

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

ในปลา (เช่น config.fish):

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

โปรดทราบว่า PATH จะต้องมีการจัดการพิเศษเนื่องจากมันเป็นอาร์เรย์ในปลา แต่สตริงที่คั่นด้วยโคลอนในทุบตี หากคุณต้องการเขียนเป็นsetenv PATH "$HOME/bin:$PATH". env คุณสามารถเขียน setenv ของปลาได้ดังนี้:

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

สิ่งนี้จะทำให้องค์ประกอบต่าง ๆ ในเส้นทางที่มีช่องว่างโคลอนหรือขึ้นบรรทัดใหม่

ความอึดอัดใจใน PATH เกิดจากการรวมสตริงที่คั่นด้วยโคลอนเข้ากับอาร์เรย์ที่แท้จริง set PATH $PATH ~/binวิธีที่ต้องการผนวกกับเส้นทางในปลาเป็นเพียง


1
การPATHแก้ไขสำหรับปลาจะทำงานกับเส้นทางด้วย: ช่องว่างหรือไม่ การขึ้นบรรทัดใหม่? สิ่งอื่น ๆ ที่ต้องระวัง?
Tyilo

[เป็น builtin [ทั้งทุบตีและปลาดังนั้นเส้นทางไม่ควรจะต้องมีการตั้งอย่างถูกต้องกับการใช้งาน ตัวอย่าง setenv ควรทำงานกับอักขระทั้งหมดใน PATH ยกเว้น colons และ newlines
ridiculous_fish

แทนที่trด้วย/usr/bin/trฉันและใช้.envไฟล์ที่ให้ไว้ในคำถามของฉันฉันได้รับข้อผิดพลาดมากมายเมื่อเริ่มการตกปลา ฉันไม่คิดว่าการจัดการเส้นทางนั้นถูกต้อง
Tyilo

โอ้ใช่แล้วปลาจะเว้นวรรคแยกไว้ในเครื่องหมายคำพูด ฉันจะอัปเดตความคิดเห็น
ridiculous_fish

มันใช้งานได้แล้ว ฉันไม่คิดว่าเปลือกอื่น ๆ (ยกเว้นปลา?) อนุญาตให้ใช้เส้นทางที่มี colons ใน PATH อยู่ดี
Tyilo

6

มีวิธีที่ง่ายกว่านี้ไหมต่อคำตอบของ @Zanchey ที่นี่

Fish Shell: วิธีการตั้งค่าตัวแปรสภาพแวดล้อมหลายตัวจากไฟล์โดยใช้การส่งออก

แยกย่อยว่า:

ปลา:

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

ทุบตี:

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

ด้วยความแตกต่าง$และการใช้xargs


สะดวกสบายมากขึ้นและไม่มีไวยากรณ์พิเศษใด ๆ ขอบคุณ
Panayotis

ใช้งานไม่ได้กับอาร์เรย์เช่น $ PATH
JanKanis

5

ระบบ Unix ส่วนใหญ่ใช้PAM pam_envโมดูล.envอ่านไฟล์มากเช่นคุณ

บน Linux , pam_envอ่านไฟล์ระบบและไฟล์ของผู้ใช้/etc/environment บน OS X (และอื่น ๆ * BSD ซึ่งใช้ OpenPAM เช่นเดียวกัน) จะปรากฏว่าอ่านไฟล์ระบบเท่านั้นดังนั้นคุณจึงไม่สามารถตั้งค่าตัวแปรต่อผู้ใช้ด้วยวิธีนี้สำหรับผู้ใช้ทั้งหมดเท่านั้น~/.pam_environmentpam_env


1

การขยายคำตอบของ @ ridiculous_fish ด้วยฟังก์ชันต่อไปนี้สำหรับการทุบตีมันยังใช้งานได้กับอาร์เรย์ที่มีช่องว่างเช่น$PATHถ้าคุณมีช่องว่างในเส้นทางของคุณ อย่างไรก็ตามsetenvมีการกำหนดไว้แล้วว่าเป็นฟังก์ชั่นในห้องสมุดมาตรฐานปลาในปัจจุบันดังนั้นฉันจึงเปลี่ยนชื่อที่นี่เป็นshenv

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

ใน.envไฟล์ของคุณคุณสามารถระบุส่วนประกอบของอาเรย์เป็นอาร์กิวเมนต์ที่แยกต่างหากกับsetenvคำสั่ง:

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

สำหรับการใช้งานที่ง่ายของ fish @ ridiculous_fish จะทำ:

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

1

เพียงแค่สร้างฟังก์ชั่นใน $ HOME / .config / fish / Functions / env.fish พร้อมเนื้อหา:

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

แชร์ vars ทั้งหมดที่สร้างใน bash ในโฟลเดอร์ /etc/profile.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

เพียงเข้าสู่ระบบในปลาหรือทุบตีทำecho $GOPATH $GOROOT $GOBIN $PATHและดูความมหัศจรรย์ :)

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