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.