A variável $0
aponta para o shell script que você mesmo executa. Então, se você tem um arquivo em que contém este
#!/bin/sh
echo "$0"
e copie-o para /bin/my-script
e para ~/somewhere/my-script-2
, torne ambas as cópias executáveis, você pode observar esse comportamento (suponho que /bin
esteja no seu $PATH
):
$ my-script
/bin/my-script
$ ~/somewhere/my-script-2
/home/luc/somewhere/my-script-2
$ cd
$ somewhere/my-script-2
somewhere/my-script-2
$ ../../bin/my-script
../../bin/my-script
$ cd /bin
$ ./my-script
./my-script
e assim por diante.
Em um shell interativo $0
aponta para o shell que você executa e é mais provável que esteja em /bin
. Portanto, se você obtiver os scripts de shell acima, sempre verá o caminho para o interpretador de shell: /bin/bash
. Para isso, os dois scripts não precisam ser executáveis:
$ . my-script
/bin/bash
$ . ~/somewhere/my-script-2
/bin/bash
$ cd
$ . somewhere/my-script-2
/bin/bash
$ . ../../bin/my-script
/bin/bash
$ cd /bin
$ . ./my-script
/bin/bash
O motivo é que um script de origem é executado no mesmo processo que origina e $0
não é alterado ( $@
é atualizado).
Se dirname "$0"
imprime /bin
para você, isso significa apenas que o arquivo executado está em /bin
ou se você está executando dirname
de uma sessão interativa ou um script de origem e o intérprete que você usa está em /bin
.
Alguns outros pontos:
- Você não precisa fazer
echo "$(dirname "$0")"
, dirname "$0"
fará o mesmo.
- Use
pwd
para obter o diretório de trabalho atual .
- Coloque aspas em torno de
$0
e substituição de comando, pois você pode ter problemas de outra forma. Tente algo como cd $(echo a b c)
para ver o problema.