bash script para cd no diretório

0

Este arquivo bash em execução no terminal Mac falhou ao alterar o diretório. Em vez disso, relatar não existe quando realmente acontece. Alguma coisa que fiz de errado?

#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH="~/Documents/meteor/apps/$name"
cd "${APPLICATION_PATH}"
    
por Fred J. 29.12.2016 / 23:04

3 respostas

5

Existem dois pontos:

  • Problemas com a expansão do til
  • Problemas com fornecimento versus execução.

Para a parte til, uma pergunta muito recente no superusuário foi sobre o mesmo problema ( link )

O til é expandido antes da variável, então o cd não consegue encontrar o caminho. Para superar isso, conduza o comando com eval como tal:

eval cd "${APPLICATION_PATH}"

Infelizmente, quando você executa o script (quer dizer, se é chmod'ed para "+ x", chamando o caminho), você verá que o $ PWD não muda no "shell atual". No entanto, se você adicionar essa linha no final do script

ls

Você verá que ls é executado no novo diretório de trabalho. Como vem?

A resposta está aqui ( link )

Short answer: sourcing will run the commands in the current shell process. executing will run the commands in a new shell process. still confused? then please continue reading the long answer.

Em breve, para alterar o $ PWD no shell atual, você deve "pesquisar" o script como tal:

source /path/to/script

ou

. /path/to/script

Um terceiro ponto: se não quiser mexer com source ou . , você pode definir um alias em seu ~ / .bashrc ( link ):

alias mycmd="source mycmd.sh"

    
por 29.12.2016 / 23:18
1

você pode usar tilda '~' você só precisa ter ativado a tecla de expansão bash apropriada

set -x

ou use o caminho completo '/ Volumes / Swap / Apps /...'

use o bashrc para definir atalhos de env como

export LocalApps=/Users/me/Applications
export SysApps=/Applications

eu não usaria eval

se você quer apenas chupar uma string da linha de comando você não precisa usar read apenas pegue o arg

if [[ $# -eq 1 ]]; then
    #check if it's directory
    if [[ -d $name ]] ; then
      #do stuff here
    else
      echo 'bomb'
    fi
else
  usage
fi

em vez de 'cd-ing' para um diretório, aprenda como usar ~ +, ~ -, pushd e popd, muitas vezes você não precisa realmente 'cd' em um diretório

você pode fazer algo assim

pushd $SysApps/$name
  do stuff 
popd
    
por 30.12.2016 / 00:30
0

Não coloque ~ dentro de ""

#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH=~/Documents/meteor/apps/$name
cd "${APPLICATION_PATH}"
pwd
    
por 30.12.2016 / 02:10