bass icon indicating copy to clipboard operation
bass copied to clipboard

`$1` is set in contrast to bash

Open hellow554 opened this issue 4 years ago • 8 comments

a.sh:

echo $1

bash -c 'source a.sh'

bass source a.sh

source a.sh

This confuses some scripts which might accept an optional argument (in my case it's the poky script from yocto)

hellow554 avatar Sep 23 '20 13:09 hellow554

Funny enough, when I type

fish ~/.local.share/omf.pkg/bass/functions/bass.fish source a.sh the output is empty as well like bash would do. That's something beyond my paygrade ;)

hellow554 avatar Sep 23 '20 13:09 hellow554

This is very interesting. I looked into it, and this seems hard to fix because we intentionally set $1 etc to mimic running the script:

$ cat a.sh
echo $1
$ bass ./a.sh abc
abc

edc avatar Oct 29 '20 05:10 edc

wontfix is a disappointing label :(

The difference is that your command is bass ./a.sh and mine is bass source a.sh. So you could distinguish it.

hellow554 avatar Oct 29 '20 07:10 hellow554

The difference is that your command is bass ./a.sh and mine is bass source a.sh. So you could distinguish it.

ping @edc

hellow554 avatar Mar 24 '21 07:03 hellow554

I was facing the same issue today. I was just about commiting a fish version of the oe-init-build-env and oe-setup-builddir scripts to their mailing list, before a came across this project, which seems more reasonable to me, as rewriting bash scripts for fish can be tenacious and expensive.

Anyway, I had a look at the sources, especially at this part:

    command = 'eval $1 && ({}; alias) >&{}'.format(
        env_reader,
        pipe_w
    )
    args = [BASH, '-c', command, 'bass', ' '.join(sys.argv[1:])]

@edc Could you please explain what passing 'bass' as a parameter to bash here does?

I guess changing these lines to the following would solve the issue for us:

    command = 'eval $0 && ({}; alias) >&{}'.format(
        env_reader,
        pipe_w
    )
    args = [BASH, '-c', command, ' '.join(sys.argv[1:])]

skycaptain avatar Jun 02 '21 18:06 skycaptain

@skycaptain

@edc Could you please explain what passing 'bass' as a parameter to bash here does?

I guess changing these lines to the following would solve the issue for us:

    command = 'eval $0 && ({}; alias) >&{}'.format(
        env_reader,
        pipe_w
    )
    args = [BASH, '-c', command, ' '.join(sys.argv[1:])]

Scripts that access the value of $0 expect to find a path to an interpreter or a path to themselves, a space-delimited list of words will thus likely be something they are not prepared to handle.

zavorka avatar Jul 14 '21 03:07 zavorka

Thanks @zavorka. I can confirm that your PR is working with the openembedded init script.

skycaptain avatar Jul 14 '21 09:07 skycaptain

According to the -c section of bash manual:

Read and execute commands from the first non-option argument command_string, then exit. If there are arguments after the command_string, the first argument is assigned to $0 and any remaining arguments are assigned to the positional parameters. The assignment to $0 sets the name of the shell, which is used in warning and error messages.

I think [BASH, '-c', command, 'bass', ' '.join(sys.argv[1:])] is the appropriate way to invoke it, though we should probably replace bass with something more appropriate because clearly it is not just "used in warning and error messages".

edc avatar Jul 19 '21 17:07 edc