TaKO8Ki / frum

A little bit fast and modern Ruby version manager written in Rust
MIT License
628 stars 15 forks source link

Frum init detects wrong shell inside shell scripts #119

Open depp opened 2 years ago

depp commented 2 years ago

I’m not sure what the exact cause is here.

Here is test.sh, which is executable:

#!/bin/sh
eval "$(frum init)"

If this script is run from zsh, the shell is detected as zsh, even though this command is running from a dash process.

$ ./test.sh
./test.sh: 6: eval: autoload: not found
./test.sh: 11: eval: add-zsh-hook: not found

I can run it from Bash, however:

$ bash
$ ./test.sh

At first I thought this was because the script was running inside dash, which is not handled in the shell detector. However, it seems that Frum simply doesn’t detect the shell when the shell is running a script:

#!/bin/bash
eval "$(frum init)"

This fails too, when invoked from zsh.

Thinking of a few ways my issue could be solved:

depp commented 2 years ago

It looks like the cause is that if you’re running a shell script, the process name is the name of the shell script, not the name of the shell. At least on Linux. It is easy enough to circumvent this by creating a subshell.

So, here's a workaround:

eval "$(sh -c 'frum init')"
dechimp commented 2 years ago

I was trying to run ruby commands from a cron job script but ran into this same scenario. However the above workaround still produces the same not found output for me.

This is an awful workaround, but it seems to get the job done:

ruby="/tmp/$(ls -t /tmp/ | grep frum_ | head -n 1)/bin/ruby"