ใช้ '~ /. profile' สำหรับปลาอีกครั้งหรือไม่


34

(ผมพูดเกี่ยวกับเชลล์ปลาทาย. ปลาของ .)

สำหรับ Bash / ZSH ฉันมีการ~/.profileส่งออกนามแฝงและอื่น ๆ

~/.profileฉันไม่ต้องการที่จะมีการตั้งค่าที่แยกต่างหากสำหรับตัวแปรสภาพแวดล้อมสำหรับปลาผมต้องการที่จะกลับมาใช้ของฉัน อย่างไร?

ในคำถามที่พบบ่อยมีการระบุว่าอย่างน้อยฉันสามารถนำเข้าสิ่งเหล่านั้นผ่านทาง/usr/local/share/fish/tools/import_bash_settings.pyได้ แต่ฉันไม่ชอบการใช้งานสำหรับ Fish-instance แต่ละตัว

คำตอบ:


26

คุณสามารถใช้ Bash เพื่อแยก / etc / profile และ ~ / .profile จากนั้นเริ่ม Fish

  1. สร้าง/usr/local/bin/fishloginด้วยเนื้อหา

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. ทำให้ปฏิบัติการได้

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. เพิ่มลงใน / etc / shells

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. ตั้งเป็นเปลือกเริ่มต้นของคุณ

    sudo usermod -s /usr/local/bin/fishlogin $USER
    

สง่างามมาก! ควรเป็นคำตอบที่ได้รับการยอมรับ IMO
yonix

2
ในกรณีที่ทุกคนสงสัยเทียบเท่า MAC ของusermod -s /usr/local/bin/fishlogin $USERเป็นchsh -s /usr/local/fishlogin $USER
gloriphobia

1
หากคุณchsh: /usr/local/bin/fishlogin: non-standard shellจำเป็นต้องเพิ่มลงใน/etc/shells
Ben Marten

1
ในการรองรับการเลียนแบบการเปิดตัวปลาโดยตรงจะถูกแทนที่ด้วยfish "$@" แทนที่กระบวนการทุบตีด้วยปลาในขณะที่ทำให้ปลาเป็นซึ่งสัญญาณว่านี่คือเปลือกเข้าสู่ระบบ exec -l fish "$@"exec-largv[0]-fish
jhrmnn

1
@Sz ไม่เลย ปลาไม่รองรับซับเซลล์ในตอนแรก และแม้ว่าจะเป็นเช่นนั้นก็จะไม่ทำเช่นนั้นโดยการดำเนินการเข้าสู่ระบบเปลือกของคุณดังนั้นจึงไม่มีการทุบตี Bash
Noé Rubinstein

15

วิธีแก้ปัญหาปัจจุบันของฉัน (ดูที่นี่สำหรับรุ่นล่าสุดอาจจะมากกว่า):

egrep "^export " ~/.profile | while read e
    set var (echo $e | sed -E "s/^export ([A-Z_]+)=(.*)\$/\1/")
    set value (echo $e | sed -E "s/^export ([A-Z_]+)=(.*)\$/\2/")

    # remove surrounding quotes if existing
    set value (echo $value | sed -E "s/^\"(.*)\"\$/\1/")

    if test $var = "PATH"
        # replace ":" by spaces. this is how PATH looks for Fish
        set value (echo $value | sed -E "s/:/ /g")

        # use eval because we need to expand the value
        eval set -xg $var $value

        continue
    end

    # evaluate variables. we can use eval because we most likely just used "$var"
    set value (eval echo $value)

    set -xg $var $value
end

3
คุณช่วยอธิบายสิ่งนี้ได้ไหม?
สูงสุด

@maxpleaner AFAICT จะค้นหา. profile สำหรับคำสั่งส่งออกและเรียกใช้งานเป็นชุดปลา มันค่อนข้างแฮ็ก แต่ฉลาด
Jared Smith

12

สำหรับโซลูชันที่สะอาดกว่านี้มากคุณสามารถใช้ปลั๊กอินenv ภายนอก :

fenv source ~/.profile

5
นี่ควรเป็นทางออกที่ยอมรับได้ คุณสามารถทำอย่างละเอียด (ติดตั้ง omf)
Jules Randolph

@JulesRandolph ไม่จำเป็นต้องทำการติดตั้ง Oh My Fish ปลั๊กอินปลา foreign_env สามารถติดตั้งได้เพียงอย่างเดียว แต่ไม่มีการพึ่งพา
Dominykas Mostauskis

5

คุณสามารถใช้เบสซึ่งเป็นปลั๊กอินในการรันคำสั่ง bash ในปลา

  1. ติดตั้งเบส

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. จากนั้นให้ใส่สิ่งนี้ลงในconfig.fish:

    bass source ~/.profile
    

นี่มันยอดเยี่ยมมากขอบคุณ
ggnoredo

หากคุณกำลังจะใช้วิธีนี้ตรวจสอบให้แน่ใจว่ามันไม่ช้าเกินไป โดยส่วนตัวฉันเริ่มสังเกตเห็นว่าความล่าช้าในการเริ่มต้นเชลล์ของฉันนั้นยาวนานและน่ารำคาญมากและติดตามมันเป็นเบส
mk12

@ mk12 อาจไม่ใช่ความผิดของเบส แต่เป็นของคุณ.profileที่เกิดขึ้นมากเกินไป
rsalmei

@rsalmei ทั้งหมดที่ฉันมีก็คือตัวแปรสภาพแวดล้อมและคำจำกัดความของนามแฝงที่มีเพียงไม่กี่คำสั่ง มันทำให้ไม่มีความล่าช้าที่เห็นได้ชัดในการทุบตี ดังนั้นฉันคิดว่ามันเป็นความผิดของเบส ในทางกลับกันผมมีความสุขมากกับปลั๊กอิน fenv มันเขียนด้วยเชลล์แทนที่จะเป็น Python และดูเหมือนว่าจะเร็วกว่าสำหรับฉัน
mk12

ใช่ @ mk12 ดูเหมือนว่าจะดี แต่ก็มีข้อ จำกัด มากขึ้นเพราะจับเฉพาะตัวแปรสภาพแวดล้อมเท่านั้น bassในทางกลับกันตีความสคริปต์เปลือกทุบตีใด ๆ และทำให้พวกเขาทำงานในปลา แน่นอนว่ามันจะมีค่าใช้จ่ายเพิ่มขึ้นเล็กน้อย แต่เล็กน้อยในประสบการณ์ของฉันทั้งหมด แต่ระยะทางของคุณอาจแตกต่างกันไป
rsalmei

4

ฉันลองหา. profile ในการเริ่มกิจการปลาและมันก็ทำงานได้อย่างมีเสน่ห์สำหรับฉัน

แค่ทำ :

echo 'source ~/.profile;clear;' >  ~/.config/fish/config.fish

รีสตาร์ทเทอร์มินัลหรือ iterm2 ทดสอบนามแฝงจาก.profileเพื่อทดสอบ

หมายเหตุ: จะไม่ทำงานกับไฟล์. profile ที่ซับซ้อนมากขึ้นซึ่งใช้ไวยากรณ์ที่ไม่มีใน fish - credit @erb


ทำงานให้ฉันด้วย! ใช้งาน MacOSX
Alexar

จะไม่ทำงานกับ.profileไฟล์ที่ซับซ้อนมากขึ้นซึ่งใช้ไวยากรณ์ที่มีอยู่ในปลา
erb

1
@erb ฉันเห็นด้วยกับคุณฉันเพิ่มคำเตือนในคำตอบ
Eswar Rajesh Pinapala

3

ติดตั้งdashและเพิ่มบรรทัดนี้ในconfig.fish:

env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source

อาจไม่จำเป็นต้องติดตั้งdash- เพิ่งshจะทำ (ซึ่งอาจเป็นเส้นประ)
Wayne Werner

1

คุณทำไม่ได้ fishไวยากรณ์ของแตกต่างจาก/bin/shไวยากรณ์Bourne shell ( ) มากเกินไป นี่คือเหตุผลเดียวกับที่คุณไม่สามารถใช้.profileกับเปลือกหอยที่ไม่ได้มาจากบอร์นอื่น ๆ เช่นและcshtcsh


.profileฉันไม่ต้องการที่จะดำเนินการอย่างเต็มที่ ฉันแค่อยากได้ทุกอย่างexportจากตรงนั้น วิธีง่าย ๆ วิธีหนึ่งก็คือวิธีegrep "^export"ที่จะดีพอสำหรับฉันแล้ว อีกวิธีที่ถูกต้องกว่านี้ก็คือ นอกจากนี้ฉันเช่นสามารถเรียกใช้import_bash_settings.pyสคริปต์นี้ซึ่งอาจทำสิ่งที่คล้ายกัน เห็นได้ชัดว่ามีหลายวิธีในการทำเช่นนี้ ด้วยคำถามของฉันที่นี่ฉันสงสัยว่าคนอื่นแก้ปัญหานี้ได้อย่างไร
อัลเบิร์ต

1

หากการแจกจ่ายของคุณใช้PAMคุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมของคุณใน~/.pam_environmentไฟล์ของคุณ


1

คุณสามารถเริ่ม Fish จาก Bash หากคุณทำเช่นนั้น Fish จะสืบทอดตัวแปรสภาพแวดล้อมทั้งหมด ( export FOO=bar) จาก Bash เมื่อถึงจุดนี้ Bash จะอ่าน.profile(หรือสิ่งที่คุณชอบ) แล้ว

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.