Altera o diretório de trabalho do diretório no shell script

2

Estou tentando escrever um script de shell simples que irá mudar o diretório para o diretório do shell script e ecoá-lo.

Este é o script:

#!/bin/bash
# cd '/explicit/path/to/script'
cd $(dirname $0)
echo $(dirname $0)

A saída, de fato, é sempre, mesmo se eu usar um CD explicito para o diretório script.

/bin

O que estou perdendo?

    
por Skip 24.05.2016 / 07:56

2 respostas

4

Você precisa executar o script em vez de pesquisá-lo:

/path/to/script.sh

(sem . ).

Quando você corre

. /path/to/script.sh

$0 é o seu shell atual, que é presumivelmente em /bin (daí o comportamento que você está vendo). Note que não precisa ser /bin/bash , o shebang não tem nenhum efeito quando se busca um script.

Lucas 'outros pontos são válidos, você deve usar aspas e apenas executar dirname diretamente, sem echo .

    
por 24.05.2016 / 08:12
3

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.
por 24.05.2016 / 08:11