我最近一直在嘗試從 切換bash到zsh或fish。
我有一些 alisa 和 PATH 設定,但我不想手動將它們復制到zshrcor config.fish。
我嘗試將它們寫在一個檔案中并source ~/.myshrc使用它們。
alisa statement可以正常采購。但是在魚殼中采購時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/"
uj5u.com熱心網友回復:
在嘗試轉換到新的 shell 時使用現有配置的一種fish簡單方法是簡單地結束你的~/.bashrcwith 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繼承您的環境的解決方案。雖然這可能是不好的做法,并且可能會導致其他型別的問題,但在短期內,如果您只想使用別名在已知領域進行嘗試,而無需花費時間撰寫組態檔,這可能就是您所需要的。bashbashrcfishPATH
我沒有經驗,zsh也不知道它是否可以同樣繼承這樣的bash環境,但如果可以的話,我不會感到驚訝。
uj5u.com熱心網友回復:
簡短的回答:
如果您采用“魚的方式”做事,您可以將您的啟動配置簡化為一行......
解釋:
首先,只是為了傳遞一些隨機知識(我最初是在 Stack Overflow 上的相關答案中學到的),以兩種不同語言以相同方式運行的代碼被稱為polyglot。它通常被認為是某種“謎題”,而不是實際的實作。確實不建議將其作為您問題的解決方案。
接下來,我的一般建議是盡可能采用魚的做事方式。當然,出于兼容性原因,有時您需要回退到 POSIX,但是fish 語法(恕我直言)要干凈得多。
我特別喜歡這樣,在魚下,我的組態檔幾乎是空的。在 fish 下,沒有必要擁有 bash 啟動中的許多專案。
讓我們分解一下啟動配置中的四種型別的專案:
- 別名
$PATH變化- 其他匯出變數
- 其他命令
別名
我建議不要在您的魚啟動檔案中放置別名。這只是沒有必要。相反,在命令列定義一次別名并使用-s(save) 選項。在你的情況下:
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"
您的別名將在那時在所有魚實體中“永久”定義,其優點是它們是“延遲加載”(僅在您第一次運行它們時才加載到記憶體中)而不是一直被加載。
$PATH 修改
同樣,fish 提供了一個方便的幫助程式,您可以使用它一次將其添加到您的路徑中,并使其在所有實體(當前運行和將來)中生效。
fish_add_path "~/.npm-global/bin" "/usr/lib/jvm/java-17-openjdk-amd64/bin" "~/Launcher/AndroidSDK/tools" "~/Launcher/AndroidSDK/platform-tools"
這會將這些路徑添加到內置的 fish通用變數$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/"
Again, as these are universal variables, they only need to be set once on the commandline. You can then remove those statements from your fish startup.
Understanding universal/global variable shadowing:
Primarily, if a global variable is set (for instance, by the parent bash process from which you launch fish), then it will override a universal variable of the same name.
For instance (pathologic example, but can easily occur in the real world, especially if you aren't aware of the potential):
# 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|
In that particular fish session, the Universal variable will be shadowed by the global one that was exported in bash.
See this Github issue of many that demonstrate the real world potential for problems.
同樣,考慮到這一點,我個人認為匯出通用變數的好處大于風險,但我想確保同時提出這兩種觀點。
其他命令
如果你到目前為止一直在跟進(并且沒有睡著——我知道我過度解釋了......),那么你會意識到(可能)只有一個命令必須保留在你的 fish 啟動中:
transset -t -a 0.95 >> /dev/null 2>&1
即使這樣,我也有一個建議。魚自動源的任何.fish檔案~/.config/fish/conf.d。我喜歡讓我的配置“模塊化”,這樣我就可以一目了然地知道啟動時正在加載什么。
我只想創建:
~/.config/fish/conf.d/xterm.fish:
transset -t -a 0.95 >> /dev/null 2>&1
那時,你就像我一樣在奔跑——一點也不fish.config!(好吧,除了新的魚版本令人惱火之外,如果它不存在,它會自動創建一個完全不必要的空版本......)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417460.html
標籤:
