Use fonte de alias com caminho relativo

1

Eu quero adicionar um arquivo de alias à pasta do meu projeto para abrir e editar rapidamente arquivos nele com um simples comando shell.
Para torná-lo mais portátil, gostaria de usar apenas caminhos relativos.
Eu quero algo assim:

### .profile

source /my/project/folder/aliases.bash

e

### aliases.bash

alias editprojectfiles="edit [/my/project/folder/]afile.txt"

O problema para mim agora é como recuperar [/my/project/folder/] automaticamente. Tentei usar a variável $PWD , mas o resultado é que o alias aponta para a pasta do arquivo .profile e não para o aliases.bash . Existe uma maneira de conseguir isso?

UPDATE

Alguns usuários apontam para a solução $PWD .
Isso não funciona, pois a variável $PWD é relativa ao caminho do comando source , não ao do projeto.
Então eu faço isso

### .profile

$~/>source /my/project/folder/aliases.bash

### aliases.bash

alias editprojectfiles="edit $PWD/afile.txt"

Criará um alias como este

editprojectfiles="edit /my/user/home/folder/afile.txt"

E fazendo isso

### Call source from folder /foo/bar

$/foo/bar>source /my/project/folder/aliases.bash

### aliases.bash

alias editprojectfiles="edit $PWD/afile.txt"

Criará um alias como este

editprojectfiles="edit /foo/bar/afile.txt"

    
por pasine 02.06.2014 / 10:42

2 respostas

3

Use aspas simples:

alias editprojectfiles='edit $PWD/afile.txt'

Melhor ainda, use isso caso você tenha espaço em branco no nome do diretório:

alias editprojectfiles='edit "$PWD"/afile.txt'

EDIT:

Depois de ler seus comentários para a resposta do savanto, acho que o que você deseja é o seguinte:

  • você tem o arquivo afile.txt em uma pasta do seu projeto atual
  • edite este arquivo
  • você passa para um projeto diferente e mv afile.txt para uma nova pasta de projeto
  • você ainda deseja editar o arquivo afile.txt em uma nova pasta de projeto

Basicamente, você quer editar o mesmo arquivo afile.txt, independentemente de sua localização. Todo arquivo no sistema de arquivos é identificado ambiguamente pelo número do inode. Você pode ver o número do inode ao lado do nome do arquivo usando o comando -i no comando ls:

$ ls -Alhi
total 4.0K
8013300 -rw-r--r-- 2 ja ja 10 Jun  3 11:38 afile.txt

Aqui 8013300 é o número do inode. Depois de mover um arquivo para um local diferente dentro do mesmo sistema de arquivos, seu número de inode não é alterado. Agora você precisa criar um hardlink apontando para afile.txt. Os hardlinks são diferentes dos links simbólicos. Hardlink tem o mesmo número de inode que o arquivo de destino. E como eu disse, o inode do arquivo permanece o mesmo, mesmo que o arquivo seja movido, então, mesmo que você mova o afile.txt original para um novo diretório, o hardlink ainda apontará para o arquivo em um novo diretório.

Use o comando ln para criar hardlink:

$ ln path/to/afile afile

Se você fez isso no diretório home, um arquivo será criado e terá o mesmo inode que o caminho / to / afile. Tente editar ~ / afile e verifique se o caminho / para / afile também é alterado. Tente mover o caminho / para / afile para um diretório diferente, edite ~ / afile e verifique novamente se o arquivo em um novo local tem a mesma aparência - deve.

Se funcionar, faça seu alias ficar assim:

alias editprojectfiles="edit ~/afile.txt"

EDIT:

Eu não acho que há uma maneira de fazer isso usando apenas o comando alias em ~ / project / aliases.bash. Você precisa passar uma variável para o comando alias que está configurado antes do comando alias. No seu caso, essa variável é o caminho em que alias.bash reside. Seu aliases.bash deve ficar assim:

DIR="$(dirname ${BASH_SOURCE[0]})";
alias editprojectfiles="edit $DIR/afile.txt"

$ DIR é um caminho para a pasta do seu projeto. Invocações subseqüentes de editprojectfiles se referirão ao diretório $ DIR que sempre será o mesmo.

    
por 02.06.2014 / 15:16
0

Você pode pesquisar o arquivo toda vez que tentar acessá-lo. Usando locate se você tiver:

alias editprojectfiles='edit "$(locate -n 1 "afile.txt")"'

Nota : -n limita os resultados. Em alguns sistemas, é -l . Veja sua página locate man.

Observação : locate usa um banco de dados atualizado periodicamente, mas nem sempre atualizado. A frequência de atualização depende do seu sistema. Se você precisar de locais de arquivos atualizados, use find .

Um pouco mais lento (mas possivelmente mais universal?) é usar find :

alias editprojectfiles='edit "$(find ~ -name "afile.txt" -print -quit)"'

Você pode torná-lo mais rápido restringindo o intervalo de pesquisa, sendo mais específico do que ~ para o diretório raiz ou controlando a profundidade.

Alternativamente

Para evitar que você pesquise a cada vez que você usa seu alias, você pode fazer a pesquisa uma vez no login e ele permanecerá válido até a duração de sua sessão. Para fazer isso, em seu arquivo de aliases, use locate ou find e atribua-o a uma variável e, em seguida, use essa variável dentro do alias:

AFILE="$(find ~ -name "afile.txt" -print -quit)"
alias editprojectfiles="edit \"$AFILE\""

Nota : aspas duplas para permitir a expansão de variáveis.

Isso, no entanto, não acompanhará o arquivo se você o mover dentro de sua sessão. Mas se você iniciar uma nova sessão, o novo local será atualizado.

    
por 03.06.2014 / 02:07