Como alterar o diretório do script sem chamar o script com. ./script ou saia do script ao chamar. ./script.sh

3

Eu tenho um script bash que move o usuário chamando o script para o novo diretório de trabalho.

Se eu chamar o script com . ./script.sh cd funciona e o usuário for movido para o novo diretório, mas o problema é que o script também está usando o comando exit se nenhum argumento for passado a ele, resultando na sessão SSH do usuário ficando fechado.

Como posso alterar o diretório sem chamar o script com . ./script.sh ou como posso sair do script sem matar a sessão do usuário ao chamar . ./script.sh .

A parte do script que estou tendo problema é esta:

 #!/bin/bash

    VAR=$1

    if [[ "$VAR" == "" ]]; then printf "No argument provided, please provide what you want to check.\n"; exit 1; fi

    change_cwd () {
    cd $NEWDIR
    }

change_cwd

Se eu chamar ./script.sh exit funcionar como pretendido, mas o diretório for alterado para subshell de script não usuário, mas se eu usar . ./script.sh , a saída mata a sessão SSH inteira do usuário que está chamando o script.

Quais seriam as maneiras de resolver isso, tanto para sair como para o cd trabalhar no script bash, para alterar o diretório de alguma outra forma ou sair do script de outra maneira?

O ponto é que eu preciso ter o script alterando o diretório de trabalho do usuário e, no caso de nenhum argumento ou argumento errado, como pretendo adicionar algumas outras verificações para $ VAR, pare de executar o restante de o script e retorne ao shell do usuário, para que o usuário execute o script novamente.

    
por rAlen 09.03.2015 / 00:23

3 respostas

0

Teste com $ # o número total de argumentos fornecidos. Se $ # for 0, não emita o comando de saída.

Não sei ao certo como é a função change_cwd porque $NEWDIR não está definido, mas aqui está um exemplo do que poderia funcionar:

    VAR=$1
    ARGC=$#

    if test $ARGC -eq 0 
    then 
      printf "No argument provided, please provide what you want to check.\n"
    else
      change_cwd ()
      {
        cd $NEWDIR
      }
    fi

(não testado, mas você começa a essência ..)

Além disso, provavelmente é melhor testar com test -z para testar uma string vazia.

    
por 09.03.2015 / 00:33
1

Se o script for invocado como ./script , ele não poderá alterar o diretório atual de seu processo pai. Então o script terá que ser invocado como . ./script .

Você pode usar o return incorporado para sair do script e voltar para o chamador. Você só pode fazer isso fora de uma função: em uma função, return retornaria da função, não do script.

Tenha em mente que, se seu script for originado, ele será executado pelo shell do usuário, não pelo bash, para que os usuários de outros shells (zsh, fish, tcsh,…) não possam usar seu script. É relativamente fácil escrever scripts que funcionem em bash e zsh (inicie seu script com emulate -L ksh 2>/dev/null e a maioria das coisas funcionará), marcadamente menor para escrever scripts que também funcionem em fish e tcsh.

Uma abordagem alternativa para contornar incompatibilidades de shell é escrever a lógica no programa de sua escolha para analisar argumentos, determinar em qual diretório se transformar, etc. Em seguida, faça o seu programa imprimir o código shell para o shell do chamador e o chamador avalia a saída do seu script. Assim, seu script pode gerar algo como

cd /some/where

ou

echo "Error: blah blah"; false

e seria invocado com

eval "'./script'"

ou um tcsh / fish /… analógico.

    
por 09.03.2015 / 00:58
0

o script está fechando a sessão ssh porque. ./roteiro não cria um subshell, em vez disso, ele executa o script em o shell atual, então saia aqui é tratado para a corrente shell interativo é normal que isso saia da sessão.

    
por 09.03.2015 / 08:03