Estou escrevendo um script genérico que pode ser passado nos caminhos absoluto e relativo (para o atual diretório de trabalho) para os arquivos existentes.
Preciso de uma maneira à prova de falhas para transformar todos esses caminhos passados em caminhos absolutos, porque preciso passar os caminhos para o comando "open", que não passará o diretório atual para o aplicativo iniciado.
Uma idéia que tive foi verificar se o caminho começa com um "/" e, se não, eu acrescentaria o caminho do diretório de trabalho atual a ele.
No entanto, gostaria de saber se existe uma solução mais inteligente para isso. Além disso, como não tenho experiência com scripts de shell e ferramentas relacionadas, nem sei como testar o valor de uma variável para começar com "/". Estou procurando uma solução portátil para executar em vários Mac, portanto, instalar ferramentas ou configurações extras seria menos do que o ideal.
Alguém pode sugerir um script padrão usando apenas ferramentas de remessa que pegam uma variável (vamos chamá-la de $ path) e a transforma em um caminho absoluto, se ainda não for absoluto?
fonte
Respostas:
Uma opção seria instalar coreutils e usar
greadlink -f
. Ele resolve links simbólicos e funciona com/Foo/
ou~/foo.txt
se eles não existem, mas não com/Foo/foo.txt
se/Foo/
não existe.Isso não resolve os links simbólicos e também não funciona
/Foo/foo.txt
.dirs -l
realiza expansão til.dirs +0
imprime apenas o diretório superior se houver outros diretórios na pilha. Você também pode substituir os subshells por algo comoold="$PWD" ... cd "$old"
.O expand_path do Ruby funciona com todos os caminhos que não existem, mas não resolve os links simbólicos.
fonte
Não tenho certeza se essa resposta será abrangente o suficiente para suas necessidades, mas é isso que eu faria…
--DISCLAIMER: Eu não testei isso no SH / BASH / Anything, então use isso como uma estrutura, por favor. Sinta-se à vontade para editar a pergunta depois que ela estiver funcionando! -
Você pode testar se o argumento do script fornecido começa com um caractere usando algo parecido
if [[ $a == "/*" ]]
.Como todos os caminhos relativos levam consigo a suposição de que o caminho de trabalho é o diretório pai, se você souber que o caminho ainda não é absoluto, poderá usá-lo
pwd
, assumindo que o script ou processo pai não alterou o diretório de trabalho .Se o problema da alteração do diretório de trabalho for significativo, você precisará usar uma função como
find
.Algumas notas adicionais que podem levá-lo ao caminho certo para resolver seu problema: https://unix.stackexchange.com/questions/6435/how-to-check-if-pwd-is-a-subdirectory-of-a- caminho determinado
http://www.unix.com/shell-programming-scripting/36200-getting-full-path-relative-path.html
https://stackoverflow.com/questions/2172352/in-bash-how-can-i-check-if-a-string-begins-with-some-value
Espero que isso coloque você na direção certa!
fonte
/*
na correspondência de padrões - entre aspas, ele trata o asterisco literalmente, e não como um curinga correspondente a todos.Não - um caminho é apenas uma string e você deve analisá-lo para decidir se é absoluto ou relativo a $ PWD ou ~
Veja-os para mais contexto, caso minha resposta seja muito curta.
fonte