Encontre um arquivo no CWD ou em qualquer de seus pais

1

Estou tentando criar aliases para comandos que estou digitando muito. Como estou trabalhando em um grande projeto construído no Laravel, preciso usar o artesão de ferramenta de linha de comando com bastante frequência. No entanto, muitas vezes não quero estar no diretório raiz com esse arquivo.

Eu normalmente não tenho que recorrer para cima em scripts que escrevi, então estou um pouco perdido. Meu primeiro pensamento é tentar usar um comando como find . -name artisan e, se ele não encontrar nada, para cd .. e verificar novamente até que o diretório de trabalho atual seja / . Então eu quero ser capaz de passar argumentos do shell script para a cópia final e encontrada do artesão.

Existe um utilitário / convenção de terminal linux / unix / osx que cuidaria disso?

Editar:

Desculpe, eu deveria ter sido claro sobre isso antes, mas não pensei sobre isso.

artisan é uma interface CLI para a estrutura PHP do Laravel . Eu trabalho na versão 3, mas se eu começar outro projeto, provavelmente usarei a versão 4. Muitas alterações de quebra existem entre essas versões, mas o mais importante é que o script artisan na raiz do projeto é apenas um script de bootstrap. código vivendo dentro do framework.

EG, porque tem dependências locais sensíveis à versão para uma paths.php reference, que informa onde outros recursos são como o próprio framework, eu não acho que posso mover isso para um diretório e link simbólico bin para isso.

Sim, eu posso ligar para o script de subdiretórios, mas eu estava procurando por algo um pouco mais automático do que isso. Por exemplo, como o Git vai localizar o diretório do repositório a partir de um subdiretório? Eu sei que ele deve recursar para cima na árvore para localizá-lo, mas como em C, eu estou com uma perda de como encontrá-lo, ou implementá-lo no script Shell / Bash.

    
por Robert K 17.01.2013 / 20:07

3 respostas

3

Você pode procurar o arquivo no diretório atual e, se não for encontrado, percorrer o sistema de arquivos até localizar o arquivo ou chegar à raiz. Por exemplo:

#!/bin/bash

wanted=$1

dir=.
while [[ ! -x "$dir/$wanted" ]]; do
    if [[ "$dir" -ef "../$dir" ]]; then
        echo "Could not find '$wanted'." 1>&2
        exit 2
    fi
    dir="../$dir"
done

echo "Found '$dir/$wanted'."

Aqui, detectamos que alcançamos a raiz notando isso. e .. consulte o mesmo diretório.

    
por 18.01.2013 / 00:16
1

Graças a resposta do Mavit e Os comentários de Scott , eu criei uma boa solução de trabalho. Eu uso isso no Mac OS X 10.6.8, mas deve ser muito portátil.

#!/bin/bash

wanted=$(basename $0)

dir=.
while [[ ! -x "$dir/$wanted" ]]; do
    if [[ "$dir" -ef "../$dir" ]]; then
        echo "$wanted is not in the current directory or any of its parents" 1>&2
        exit 2
    fi

    dir="../$dir"
done

# Find the absolute path to the command
dir=$(cd -- "$dir" && pwd)

if [[ "$dir/$wanted" -ef "$0" ]]; then
    echo "Cannot call self."
    exit 2
fi

# Execute the command and pass in $1... parameters to it.
exec "$dir/$wanted" "$@"
    
por 20.03.2017 / 11:17
0

Se você estiver procurando por um comando em particular (e você sabe onde deveria estar), por que não chamá-lo com o caminho completo como /usr/local/bin/path/to/artisan ou adicionar o diretório do artesão à sua variável PATH.

    
por 17.01.2013 / 20:51