How to change argv[0] value in shell / bash script

2020-03-30 07:28发布

问题:

The set command can be used to change values of the positional arguments $1 $2 ...

But, is there any way to change $0 ?

回答1:

Here is another method. It is implemented through direct commands execution which is somewhat better than sourcing (the dot command). But, this method works only for shell interpreter, not bash, since sh supports -s -c options passed together:

#! /bin/sh
# try executing this script with several arguments to see the effect

test ".$INNERCALL" = .YES || {
    export INNERCALL=YES
    cat "$0" | /bin/sh -s -c : argv0new "$@"
    exit $?
}

printf "argv[0]=$0\n"
i=1 ; for arg in "$@" ; do printf "argv[$i]=$arg\n" ; i=`expr $i + 1` ; done

The expected output of the both examples in case ./the_example.sh 1 2 3 should be:

argv[0]=argv0new
argv[1]=1
argv[2]=2
argv[3]=3


回答2:

In Bash greater than or equal to 5 you can change $0 like this:

$ cat bar.sh
#!/bin/bash
echo $0
BASH_ARGV0=lol
echo $0
$ ./bar.sh 
./bar.sh
lol

ZSH even supports assigning directly to 0:

$ cat foo.zsh
#!/bin/zsh
echo $0
0=lol
echo $0
$ ./foo.zsh 
./foo.zsh
lol


回答3:

#! /bin/sh
# try executing this script with several arguments to see the effect

test ".$INNERCALL" = .YES || {
    export INNERCALL=YES
    # this method works both for shell and bash interpreters
    sh -c ". '$0'" argv0new "$@"
    exit $?
}

printf "argv[0]=$0\n"
i=1 ; for arg in "$@" ; do printf "argv[$i]=$arg\n" ; i=`expr $i + 1` ; done