简体   繁体   中英

How do I source a zsh script from a bash script?

I need to extract some variables and functions from a zsh script into a bash script. Is there any way to do this? What I've tried (some are embarrassingly wrong, but covering everything):

. /script/path.zsh . /script/path.zsh (zsh-isms exist, so it fails)

exec zsh
. /script/path.zsh
exec bash
zsh << 'EOF'
. /script/path.zsh
EOF
chsh -s zsh
. /script/path.zsh
chsh -s bash

This thread is the closest I've found. Unfortunately, I have too many items to import for that to be feasible, and neither script is anywhere near a polyglot. However, the functions and variables that I need to import are polyglots.

You can "scrape" the zsh source file for what you need, then execute the code in bash using eval . Here's an example for doing this for a few functions:

File script.zsh :

test1() {
    echo "Hello from test1"
}

test2() {
    echo $((1 + $1))
}

File script.sh (bash):

# Specify source script and functions
source_filename="script.zsh"
source_functions=" \
    test1          \
    test2          \
"

# Perform "sourcing"
function_definitions="$(python -B -c "
import re
with open('${source_filename}', mode='r') as file:
    content = file.read()
for func in '${source_functions}'.split():
    print(re.search(func + r'\(\).*?\n}', content, flags=re.DOTALL).group())
" )"
eval "${function_definitions}"

# Try out test functions
test1                         # Hello from test1
n=5
echo "$n + 1 is $(test2 $n)"  # 5 + 1 is 6

Run the bash script and it will make use of the functions test1 and test2 defined in the zsh script:

bash script.sh

The above makes use of Python, specifically its re module. It simply looks for character sequences of the form funcname() , and assumes that the function ends at the first } . So it's not very general, but works if you write your functions in this manner.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM