Como alterar o diretório no final de um script bash?

0

No meu .bashrc :

function rnew { $HOME/.dotfiles/railsnewapp.sh $1; }

Essencialmente, eu chamo rnew de qualquer diretório, e ele cria um diretório em ~/code/appname , instala o Rails nele, e então eu quero que o pwd se torne ~/code/appname .

Em ~/.dotfiles/railsnewapp.sh :

#! /bin/bash
appname=$1
appdirectory="$HOME/code/$appname"
if [ -d $appdirectory ]; then
  echo $appdirectory already exists. Not creating Rails app $appname.
else
  mkdir $appdirectory
  cd $appdirectory
  if [ 'pwd' == $appdirectory ]; then
    echo "rvm use 1.8.7@$appname" >> "$appdirectory/.rvmrc"
    rvm gemset create $appname
    cd ..
    rails new $appname -m $HOME/code/config/base_template.rb -T -J
    cd $appdirectory
    if [ 'pwd' == $appdirectory ]; then
      git init .
    else
      echo Could not create git repo in $appdirectory. Could not switch to that directory.
    fi

  else
    echo Could not switch to directory $appdirectory. No creating Rails app $appname.
  fi
fi

######## how to switch to $appdirectory here so that 
######## when the 'rnew' function completes and I'm back at the
######## terminal and the 'pwd' is $appdirectory?

Ps. Eu não quero fazer um cd em rnew . Como você pode ver no script, estou certificando-me de que o aplicativo é criado no diretório correto e outras verificações relacionadas ao diretório, portanto, não acho que posso chamar o script de rnew para um diretório que ainda está para ser criado?

    
por Zabba 29.04.2011 / 19:46

3 respostas

1

Você precisa ter certeza de que a mudança de diretório acontece no shell atual, fazendo o sourcing (observe o . antes de $HOME ):

function rnew { . $HOME/.dotfiles/railsnewapp.sh $1; }

É um shell embutido, de help . :

.: . filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.

Note que isso faz com que o script railsnewapp.sh seja executado no shell atual, as variáveis definidas no shellscript estarão disponíveis para o shell quando ele for finalizado.

    
por Lekensteyn 29.04.2011 / 19:48
3

Outra opção: peça ao seu script para imprimir o nome do diretório no final do script.

...
echo "$appdirectory"
exit

Para quaisquer condições de erro, imprima a mensagem de erro para stderr ( echo something >&2 ) e saia com um código de retorno diferente de zero ( exit 1 ). Esta é uma boa prática de qualquer maneira.

Então a função pode parecer com:

rnew () { 
    local dir=$( $HOME/.dotfiles/railsnewapp.sh "$1" )
    [[ $? -eq 0 ]] && cd "$dir" 
}
    
por glenn jackman 29.04.2011 / 20:34
1

Por que não fazer tudo nessa função? Algo como:

rnew() {
    local appdir="$HOME/code/$1"
    mkdir "$appdir" || return
    echo "rvm use 1.8.7@$1" > "$appdir/.rvmrc"
    (cd "$appdir" && rvm gemset create "$1") || return
    rails new "$1" -m "$HOME/code/config/base_template.rb" -T -J || return
    cd "$appdir" && git init .
}
    
por geirha 01.05.2011 / 16:54