4

I have a bash script that looks like this:

...
SOME_VARIABLE=$(readlink -f $(dirname ${BASH_SOURCE[0]}))
export SOME_VARIABLE
...

I need to source it from a zsh shell as I need to have all the environment variables it defines.

The issue is that I get this error message because of BASH_SOURCE:

dirname: missing operand
Try 'dirname --help' for more information.
readlink: missing operand
Try 'readlink --help' for more information.
Invalid location:

Constraints: I cannot modify the script.

Question: Can I source a bash script containing BASH_SOURCE from zsh?

  • 2
    Source it from a bash shell, then start the zsh shell. – Kusalananda Nov 1 '18 at 10:31
  • 1
    . <(awk '{gsub(/\${BASH_SOURCE\[0\]}/, FILENAME); print}' /path/to/the/bash/script) – mosvy Nov 1 '18 at 11:44
  • @mosvy that works for me, I would mark it as accepted if it was an answer instead of a comment – rual93 Nov 1 '18 at 11:54
3

Instead of doing . /path/to/that/script.bash, do:

BASH_SOURCE=/path/to/that/script.bash emulate ksh -c '. $BASH_SOURCE'

emulate ksh -c '...' runs the code in ksh emulation (so that for instance, array indices start at 0 like in bash) and also makes sure all functions defined within inherit that emulation mode.

$BASH_SOURCE in bash refers to the file being sourced, so we preseed that variable with the path of the script.

The zsh equivalent of that bash code would be:

export SOME_VARIABLE=$0:h:P

(:h giving the head like in csh (the equivalent of dirname), and :P the equivalent of GNU readlink -f).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.