簡體   English   中英

fish、zsh和bash可以導入同一個配置文件嗎?

[英]Can fish, zsh and bash import the same configuration file?

我最近一直在嘗試從bash切換到zshfish

我有一些 alisa 和 PATH 設置,但我不想手動將它們復制到zshrcconfig.fish

我嘗試將它們寫在一個文件中並使用source ~/.myshrc來使用它們。

alisa statement可以正常獲取。 但是在魚 shell 中采購PATH時出現錯誤:

在 fish 中,請使用 {$JAVA_HOME}。 出口
CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

我知道fish和bash語法不兼容。

那么是否有一種通用語法允許我修改 myshrc 中的 PATH ,然后所有三個 shell 都可以使用它?

myshrc文件如下:

# alias 
alias apts="apt search"
alias sf="aptitude search -F '%c %p %d %D %I'"
alias apti="sudo aptitude install"
alias aptup="sudo aptitude update"
alias aptgr="sudo aptitude upgrade"
alias aptpu="sudo aptitude purge"

# transset xterm
transset -t -a 0.95 >> /dev/null 2>&1


# set npm path
export PATH=~/.npm-global/bin:$PATH

# set java path
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 
export JRE_HOME=${java_home}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

# set android path
export ANDROID_HOME="/home/moly/Launcher/AndroidSDK/"
export PATH="${PATH}:${ANDROID_HOME}tools/:${ANDROID_HOME}platform-tools/"

在嘗試過渡到像fish這樣的新 shell 時,使用現有配置的一種巧妙方法是簡單地以~/.bashrc結尾fish ,如下所示:

# alias 
alias apts="apt search"
alias sf="aptitude search -F '%c %p %d %D %I'"
alias apti="sudo aptitude install"
alias aptup="sudo aptitude update"
alias aptgr="sudo aptitude upgrade"
alias aptpu="sudo aptitude purge"

# transset xterm
transset -t -a 0.95 >> /dev/null 2>&1


# set npm path
export PATH=~/.npm-global/bin:$PATH

# set java path
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 
export JRE_HOME=${java_home}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

# set android path
export ANDROID_HOME="/home/moly/Launcher/AndroidSDK/"
export PATH="${PATH}:${ANDROID_HOME}tools/:${ANDROID_HOME}platform-tools/"

# start fish
exec fish

我不認為這是一個很好的解決方案,但這是我所知道的唯一一個讓fish繼承你的bash環境而不重寫/翻譯你的bashrc 雖然這可能是不好的做法,並且可能會導致其他類型的問題,但在短期內,如果您只想使用別名和PATH在已知區域中嘗試fish ,而無需花費時間編寫配置文件,這可能就是您所需要的。 .

我沒有使用zsh的經驗,不知道它是否可以同樣繼承bash環境,但如果可以的話也不會感到驚訝。

簡短的回答:

如果您采用“魚的方式”做事,您可以將您的啟動配置簡化為一行......

解釋:

首先,只是為了傳遞一些隨機知識(我最初是在 Stack Overflow 上的相關答案中學到的),以兩種不同語言以相同方式運行的代碼被稱為polyglot 它通常被認為是某種“謎題”,而不是實際的實現。 確實不建議將其作為您問題的解決方案。

接下來,我的一般建議是盡可能采用魚的做事方式。 當然,出於兼容性原因,有時您需要回退到 POSIX,但是fish 語法(恕我直言)要干凈得多。

我特別喜歡這樣,在魚下,我的配置文件幾乎是空的。 在 fish 下,沒有必要擁有 bash 啟動中的許多項目。

讓我們分解一下啟動配置中的四種類型的項目:

  • 別名
  • $PATH更改
  • 其他導出變量
  • 其他命令

別名

我建議不要在您的魚啟動文件中放置別名。 這只是沒有必要。 相反,在命令行定義一次別名並使用-s (保存)選項。 在你的情況下:

alias -s apts="apt search"
alias -s sf="aptitude search -F '%c %p %d %D %I'"
alias -s apti="sudo aptitude install"
alias -s aptup="sudo aptitude update"
alias -s aptgr="sudo aptitude upgrade"
alias -s aptpu="sudo aptitude purge"

您的別名將在所有魚實例中“永久”定義,其優點是它們是“延遲加載”(僅在您第一次運行時加載到 memory 中)而不是一直加載。


$PATH修改

同樣,fish 提供了一個方便的幫助程序,您可以使用它一次將其添加到您的路徑中,並使其在所有實例(當前運行和將來)中生效。

fish_add_path "~/.npm-global/bin" "/usr/lib/jvm/java-17-openjdk-amd64/bin" "~/Launcher/AndroidSDK/tools" "~/Launcher/AndroidSDK/platform-tools"

這會將這些路徑添加到內置魚通用變量$fish_user_paths中,該變量會自動添加到系統路徑中。 請注意,在您的 bash rc 中,您已經附加了 Android SDK 路徑,但這可能不是必需的。 通常,您需要在系統路徑之前添加用戶路徑。


其他導出變量

這部分有點爭議,因為魚通用變量在導出到其他進程時可能會產生意想不到的副作用。

一方面,其中一位魚類維護者(@faho)在此答案中提到:

通常,您想要的只是將 set -gx 放入~/.config/fish/config.fish 那是fish的配置文件。

Fish 也有“通用”變量,它們被持久存儲,但它們與導出的交互很尷尬,所以我不推薦它。

我有其他人(請參閱對此答案的評論)與魚進行了廣泛的合作,也建議不要這樣做。

另一方面,對這個答案的 196 次投票似乎表明人們喜歡為此目的的普遍性。 這並不是說大多數人是正確的——我已經看到了一些非常糟糕的答案,但得到了很多人的支持。

但是,我個人喜歡使用它們來簡化我的配置文件。

如果您願意,您可以:

set -Ux JAVA_HOME "/usr/lib/jvm/java-17-openjdk-amd64"
set -Ux JRE_HOME "$JAVA_HOME/jre"
set -Ux --path CLASSPATH ".:$JAVA_HOME/lib:$JRE_HOME/lib"
set -Ux ANDROID_HOME "/home/moly/Launcher/AndroidSDK/"

同樣,由於這些是通用變量,它們只需要在命令行上設置一次 然后,您可以從您的 fish 啟動中刪除這些語句。

了解通用/全局變量陰影:

首先,如果設置了一個全局變量(例如,由啟動 fish 的父 bash 進程),那么它將覆蓋同名的通用變量。

例如(病態的例子,但在現實世界中很容易發生,特別是如果你沒有意識到潛力):

# Start in Fish
-> set -Ux JAVA_HOME "/usr/lib/jvm/java-17-openjdk-amd64"
-> set --show JAVA_HOME
$JAVA_HOME: set in universal scope, exported, with 1 elements
$JAVA_HOME[1]: |/usr/lib/jvm/java-17-openjdk-amd64|
-> bash
-> export JAVA_HOME="~/.local/share/jvm/java-17-openjdk-amd64"
-> fish
-> set --show JAVA_HOME
$JAVA_HOME: set in global scope, exported, with 1 elements
$JAVA_HOME[1]: |~/.local/lib/jvm/java-17-openjdk-amd64|
$JAVA_HOME: set in universal scope, exported, with 1 elements
$JAVA_HOME[1]: |/usr/lib/jvm/java-17-openjdk-amd64|

在特定的魚 session 中,通用變量將被在 bash 中導出的全局變量所遮蔽。

請參閱此 Github 問題其中許多展示了現實世界潛在的問題。

同樣,考慮到這一點,我個人認為導出通用變量的好處大於風險,但我想確保同時提出這兩種觀點。

其他命令

如果您到目前為止一直在跟進(並且還沒有睡着——我知道我過度解釋了......),那么您會意識到(可能)只有一個命令必須保留在您的 fish 啟動中:

transset -t -a 0.95 >> /dev/null 2>&1

即使這樣,我也有一個建議。 Fish 自動獲取~/.config/fish/conf.d中的任何.fish文件。 我喜歡讓我的配置“模塊化”,這樣我就可以一目了然地知道啟動時正在加載什么。

我只想創建:

~/.config/fish/conf.d/xterm.fish

transset -t -a 0.95 >> /dev/null 2>&1

在這一點上,你像我一樣運行——根本沒有fish.config ,(好吧,除了新的魚版本令人惱火之外。如果它不存在,自動創建一個完全不必要的空文件......)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM