sử dụng lại '~ / .profile` cho cá?


34

(Tôi đang nói về vỏ , đặc biệt là Cá của cá .)

Đối với Bash / ZSH, tôi đã ~/.profilecó một số xuất khẩu, bí danh và những thứ khác.

Tôi không muốn có một cấu hình riêng cho các biến môi trường cho Fish, tôi muốn sử dụng lại ~/.profile. Làm sao?

Trong Câu hỏi thường gặp, có thông báo rằng tôi ít nhất có thể nhập chúng qua /usr/local/share/fish/tools/import_bash_settings.py, tuy nhiên tôi không thực sự thích chạy nó cho từng cá thể.

Câu trả lời:


26

Bạn có thể sử dụng Bash để phân tích / etc / profile và ~ / .profile, sau đó bắt đầu câu cá.

  1. Tạo /usr/local/bin/fishloginnội dung

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. Làm cho nó thực thi

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. Thêm nó vào / etc / shell

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. Đặt nó làm vỏ mặc định của bạn

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

Thật thanh lịch! Phải là câu trả lời được chấp nhận IMO
yonix 22/03/2017

2
Chỉ trong trường hợp bất cứ ai thắc mắc, mac tương đương usermod -s /usr/local/bin/fishlogin $USERchsh -s /usr/local/fishlogin $USER
gloriphobia

1
Nếu bạn chsh: /usr/local/bin/fishlogin: non-standard shellcần thêm nó vào/etc/shells
Ben Marten

1
Để bắt chước hoàn toàn việc phóng cá trực tiếp, fish "$@"nên được thay thế bằng exec -l fish "$@". execthay thế quá trình bash bằng cá, trong khi -lnguyên nhân argv[0]cho cá là -fish, điều này báo hiệu rằng đây là một vỏ đăng nhập.
jhrmnn

1
@Sz. Vâng, không. Cá không hỗ trợ subshells ở nơi đầu tiên. Và ngay cả khi nó đã làm, nó sẽ không làm như vậy bằng cách thực thi shell đăng nhập của bạn, vì vậy sẽ không có Bash nào được sinh ra.
Noé Rubinstein

15

Giải pháp hiện tại của tôi (xem ở đây để biết phiên bản có thể gần đây hơn):

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
bạn có thể giải thích điều này không?
tối đa

@maxpleaner AFAICT nó xem qua .profile cho các câu lệnh xuất khẩu và thực thi chúng dưới dạng tập hợp cá. Thật là khó tin, nhưng thông minh.
Jared Smith

12

Đối với một giải pháp sạch hơn nhiều, bạn có thể sử dụng plugin env nước ngoài :

fenv source ~/.profile

5
Đây phải là giải pháp được chấp nhận. Bạn có thể giải thích (cài đặt omf)
Jules Randolph

@JulesRandolph không cần cài đặt Oh My Fish. Plugin fish_env có thể được cài đặt một mình, nó không có phụ thuộc.
Dominykas Mostauskis

5

Bạn có thể sử dụng bass , một plugin để thực hiện các lệnh bash trong cá.

  1. Cài đặt bass .

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. Và sau đó, chỉ cần đặt điều này trong config.fish:

    bass source ~/.profile
    

điều này thật tuyệt vời cảm ơn bạn
ggnoredo

Nếu bạn sẽ sử dụng phương pháp này, hãy đảm bảo rằng nó không quá chậm. Cá nhân tôi bắt đầu nhận thấy rằng độ trễ khởi động shell của tôi rất khó chịu và theo dõi nó thành âm trầm.
mk12

@ mk12 có lẽ không phải lỗi của bass, đó là lỗi của bạn .profileđang diễn ra quá nhiều.
rsalmei

@rsalmei Tất cả những gì tôi có trong đó là các định nghĩa biến môi trường và bí danh, với một vài câu lệnh if. Nó gây ra sự chậm trễ đáng chú ý trong bash. Vì vậy, tôi nghĩ rằng đó là lỗi của bass. Mặt khác, tôi hạnh phúc hơn nhiều với plugin fenv . Nó được viết bằng shell chứ không phải Python và dường như nhanh hơn nhiều đối với tôi.
mk12

Yeah @ mk12, nó có vẻ tốt, nhưng cũng hạn chế hơn, vì nó chỉ nắm bắt các biến môi trường. bassmặt khác diễn giải bất kỳ tập lệnh bash shell nào và làm cho chúng chạy trong cá. Nó chắc chắn sẽ có thêm một chút chi phí, nhưng hoàn toàn không đáng kể trong kinh nghiệm của tôi, nhưng số dặm của bạn có thể thay đổi.
rsalmei

4

Tôi đã thử tìm nguồn cung ứng .profile khi khởi động cá và nó hoạt động như một cơ duyên đối với tôi.

cứ làm đi :

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

Khởi động lại thiết bị đầu cuối hoặc iterm2, kiểm tra bí danh từ .profileđể kiểm tra.

Lưu ý: Không hoạt động với các tệp .profile phức tạp hơn sử dụng cú pháp không có sẵn trong cá - credit @erb


Làm việc cho tôi quá! Chạy MacOSX.
Alexar

Không hoạt động với các .profiletệp phức tạp hơn sử dụng cú pháp không có sẵn trong cá.
erb

1
@erb Tôi đồng ý với bạn, tôi đã thêm lời cảnh báo trong câu trả lời.
Eswar Rajesh Pinapala

3

Cài đặt dashvà thêm dòng này vào 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

Có lẽ thậm chí không cần phải cài đặt dash- chỉ cần shlàm (có lẽ là dấu gạch ngang)
Wayne Werner

1

Bạn không thể. fishCú pháp của quá khác với /bin/shcú pháp Bourne shell ( ). Đây là cùng một lý do bạn không thể sử dụng .profilevới các shell không có nguồn gốc Bourne khác, chẳng hạn như cshtcsh.


Tôi không muốn thực hiện đầy đủ .profile. Tôi chỉ muốn nhận được tất cả exporttừ đó. Một cách dễ dàng egrep "^export"sẽ là đủ tốt cho tôi. Một giải pháp khác, đúng hơn sẽ là điều này . Ngoài ra, tôi ví dụ có thể chạy import_bash_settings.pytập lệnh này có thể làm điều gì đó tương tự. Vì vậy, rõ ràng có nhiều cách để làm điều này. Với câu hỏi của tôi ở đây, tôi đã tự hỏi làm thế nào những người khác đã giải quyết điều này.
Albert

1

Nếu bản phân phối của bạn sử dụng PAM , bạn có thể đặt các biến môi trường trong ~/.pam_environmenttệp của mình .


1

Bạn có thể bắt đầu Cá từ Bash. Nếu bạn làm điều đó, Fish sẽ kế thừa tất cả các biến môi trường ( export FOO=bar) từ Bash. Tại thời điểm này, Bash sẽ đọc .profile(hoặc tương tự) của bạn.

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
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.