[英]Can fish, zsh and bash import the same configuration file?
我最近一直在嘗試從bash
切換到zsh
或fish
。
我有一些 alisa 和 PATH 設置,但我不想手動將它們復制到zshrc
或config.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.