Como cd em relação ao arquivo .command em vez de codificar hard-coding?

1

Estou configurando um modelo de projeto para o meu escritório que usa arquivos .command para encapsular algumas funções de linha de comando, já que nem todos no escritório são especialistas em terminal. Na maior parte, isso envolverá mudanças no caminho dentro do projeto e o lançamento de alguns compiladores / observadores como compass ou grunt .

Aqui está o problema que estou encontrando - com cada projeto tendo seu próprio svn repo, o caminho para qualquer raiz do projeto será diferente para cada usuário:

  • Bob: /Users/bobsmith/work/clients/client-a/project-a
  • Jane: /Users/janedoe/web/projects/project-a

Eu quero colocar .command arquivos dentro de um projeto que são capazes de encontrar a raiz do projeto, independentemente de onde o projeto está localizado dentro do sistema. Existe alguma maneira de conseguir isso? Talvez referenciando o caminho do .command sendo executado? Aqui está um exemplo de .command que já está em vigor:

# Replace this path with your project directory - remember to ignore it in svn!
cd /Users/janedoe/web/projects/project-a
grunt watch
    
por CodeMoose 16.06.2014 / 21:32

1 resposta

2
# This will cd into the directory in which the .command file exists
cd "$(dirname "$0")"

Por outro lado ...

#  This will define an environment variable that contains the full absolute path 
#+ to the directory in which the .command file is kept, and then will cd into 
#+ that directory
ABSPATH="$(cd "$(dirname "$0")" && pwd)"
cd "$ABSPATH"

Por que todas as aspas duplas?

Sem eles, as coisas quebram quando o usuário tem espaços no caminho para o projeto. Também, provavelmente óbvio, mas isso também será interrompido se o usuário não puder fazer o cd no diretório do projeto.

Por que $ (...) ao invés de '...'?

Essa primeira sintaxe é mais recente e preferida em relação à segunda. Além disso, é mais fácil de ver. Se você acha que os parentes correspondentes são irritantes, tente combinar os backticks - especialmente quando há aspas simples intercaladas entre eles. Ambos fazem a mesma coisa; bifurque uma subcamada e execute o comando interno dentro dessa subcamada.

    
por 16.06.2014 / 22:10