Skip to content

Commit

Permalink
Fix chruby-exec sourcing chruby.sh
Browse files Browse the repository at this point in the history
chruby-exec works as follows:

1. test for presence of chruby with `command -v chruby >/dev/null`
2. source `chruby.sh` if chruby is not loaded
3. execute `chruby $ruby && $command` in a subshell

The problem is that sourced functions, unlike environmental variables,
are not 'inherited' by subshells.
(It is true at least in Ubuntu 12.04 LTS, where I tested this)

With "basic setup" you copy `chruby.sh` to `/etc/profile.d`, and this
`chruby.sh` sources `/usr/share/local/chruby/chruby.sh`
Then, when you invoke `chruby_exec` it works just fine, because
`/usr/share/local/chruby/chruby.sh` is sourced automaticaly by bash
through `/etc/profile` initialization script (which sources
`/etc/profile.d/chruby.sh`)

It would be great if you consider moving the process of sourcing
`/usr/share/local/chruby/chruby.sh` from the top of `chruby_exec` to a
command executed by a subshell. It would allow to use `chruby_exec`
without needing to source `/usr/local/chruby/chruby.sh` with shell init
scripts (`/etc/profile.d/chruby.sh`)

About function inheritance in a subshells

You could check it with the following setup:

    # set_func.sh:
    function test_func()
    {
        0
    }

    # file get_func.sh:
    source ./set_func.sh

    type test_func | head -1

    exec "$SHELL" -i -l -c "type test_func | head -1"

and then:

    $ ./get_func.sh
    test_func is a function
    bash: type: test_func: not found
  • Loading branch information
artempyanykh authored and postmodern committed Dec 29, 2014
1 parent ef054dc commit 6cdaefd
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions bin/chruby-exec
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
#!/usr/bin/env bash

source "${0%/*}/../share/chruby/chruby.sh"

case "$1" in
-h|--help)
echo "usage: chruby-exec RUBY [RUBYOPTS] -- COMMAND [ARGS...]"
Expand Down Expand Up @@ -33,7 +31,9 @@ if (( $# == 0 )); then
exit 1
fi

command="chruby $(printf "%q " "${argv[@]}") && $(printf "%q " "$@")"
chruby_sh="${0%/*}/../share/chruby/chruby.sh"
source_command="command -v chruby >/dev/null || source $chruby_sh"
command="$source_command; chruby $(printf "%q " "${argv[@]}") && $(printf "%q " "$@")"

if [[ -t 0 ]]; then exec "$SHELL" -i -l -c "$command"
else exec "$SHELL" -l -c "$command"
Expand Down

0 comments on commit 6cdaefd

Please sign in to comment.