我有一個 shell 腳本,其語法與bash和兼容zsh,但具有 zsh 特定語法的部分除外。如果來自 bash 會引發語法錯誤,那么在使用 bash 時是否有一種簡單的方法可以轉義此類部分。
該腳本是一個 bash 函式,用于獲取目錄中的所有檔案。它以 zsh 形式運行良好(與問題無關)
#!/usr/bin/env bash
shell=$(ps -p $$ -oargs=)
if [ $shell = "bash" ]; then
for f in ~/.functions.d/*.sh; do source $f; done
elif [ $shell = "zsh" ]; then
for f (~/.functions.d/**/*.sh) source $f
fi
錯誤是由第 7 行產生的,當它在 bash
相關鏈接
- https://unix.stackexchange.com/questions/242854/source-only-part-of-a-script-from-another-script
- 使用 source 在 bash 腳本中包含檔案的一部分
uj5u.com熱心網友回復:
問題是整個if/elif/else陳述句被決議為一個單元,所以它不能包含無效的語法。
您可以做的是在執行特定于 zsh 的代碼之前退出源腳本:
shell=$(ps -p $$ -oargs=)
if [ $shell = "bash" ]; then
for f in ~/.functions.d/*.sh; do source $f; done
return
fi
if [ $shell = "zsh" ]; then
for f (~/.functions.d/**/*.sh) source $f
fi
但是,更通用的解決方案是將特定于 bash 和特定于 zsh 的代碼提取到單獨的腳本中。
shell=$(ps -p $$ -oargs=)
if [ $shell = "bash" ]; then
source load_functions.bash
fi
if [ $shell = "zsh" ]; then
source load_functions.zsh
fi
load_functions.bash將包含第一個for回圈,而將包含第二個回圈load_functions.zsh。
uj5u.com熱心網友回復:
我會做一個
if [[ -n ${BASH_VERSION:-} ]]
then
: we are in bash
else
: we are not
fi
該變數BASH_VERSION保證由 bash 設定,除非您明確(惡意)篡改此變數,否則應該沒問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/383721.html
