Dois scripts: Um diretório em mudança não é outro?

1

Eu tenho dois scripts. Uma é:

#!/bin/bash
if [ $1 = 1 ]; then 
   dir=mydir-1.6_
else
    dir=mydir
fi
cd ~/code/${dir}$2
echo $(pwd)

O script acima altera os diretórios, embora existam vários posts que dizem que, como um script é executado em um sub-shell, ele não deve ter efeito no shell de execução.

Agora tenho outro script:

#!/bin/bash
dir=/WORK/temp/$1
mkdir -p $dir
cd $dir
wget http://somurl.com/archive.zip
unzip archive.zip

O script acima descompacta o arquivo no diretório esperado, mas deixa o shell de chamada no mesmo diretório. Qual é a diferença quando cd é chamado em ambos os scripts?

    
por Salil Surendran 17.12.2016 / 03:26

2 respostas

0

Se eu entendi qual é o seu problema, você pode tentar executar o segundo script a partir do primeiro, passando no diretório esperado. Assim.

script 1

#!/bin/bash
TEST="1234"
echo "$TEST"
bash 2.sh "$TEST"

script 2

#!/bin/bash
TEST="$1"
echo "$TEST"
    
por 17.12.2016 / 20:20
0

Seu primeiro script não altera o diretório. Eu não sei o que faz você pensar, mas cd dentro de um script executado irá nunca afetar o shell pai. É assim que funciona.

A única maneira de alterar o diretório do shell pai é se você o contratar, em vez de executá-lo. Salvei seu primeiro script como foo.sh e o executei em $HOME :

$ pwd
/home/terdon
$ foo.sh 1 
/home/terdon/code/mydir-1.6_
$ pwd
/home/terdon

Como você pode ver, o diretório é alterado dentro do script, mas o PWD do shell pai permanece inalterado. Agora, se você comprá-lo, funciona como você espera:

$ . ~/scripts/foo.sh
bash: [: =: unary operator expected
/home/terdon/code/mydir
$ pwd
/home/terdon/code/mydir

Portanto, se você quiser que o seu script altere o diretório de seu shell pai, você precisa criar a fonte para não executá-lo. No entanto, se é isso que você está tentando fazer, você quer escrever uma função, não um script:

changeDir(){
    targetDir="mydir"
    if [ "$1" = "1" ]; then
       targetDir="mydir-1.6_"
    fi
    \cd "$targetDir"
}

Adicione o acima ao seu ~/.bashrc e use isso em vez de um script. As funções sempre afetam o shell que as executa, de modo que ele alterará seu diretório como você deseja.

Observe que estou usando \cd em vez de cd . Isso é para o caso de seu cd estar aliado a algo . Observe também que alterei um pouco seu script para evitar o bash: [: =: unary operator expected que você estava obtendo com sua abordagem original. Em scripts de shell, é essencial para sempre citar suas variáveis. Nesse caso, quando $1 estava vazio, o script estava tentando ser executado:

$ if [ = 1 ]; then  targetDir="mydir-1.6_"; fi
bash: [: =: unary operator expected

O que, é claro, dá um erro, já que não há nada para comparar. Citando $1 , você está comparando a string vazia e isso funcionará como esperado.

    
por 21.12.2016 / 11:39