Resolve caminho relativo sem resolver links simbólicos no bash

0

Estou procurando uma maneira portátil de resolver caminhos relativos em caminhos absolutos sem resolver links simbólicos.

Por exemplo, execute o seguinte arquivo /home/nat/cat/bat/hat.sh no bash:

set -x
pwd
# cat is a symlink
readlink -e ..
# abs is an imaginary function that returns the path in the form specified by this question    
abs ..
abs /home/./nat/../nat/cat

Saída:

+ pwd
/home/nat/cat/bat
+ readlink -e ..
/home/nat/cat-1.12.0
+ abs ..
/home/nat/cat
+ abs /home/./nat/../nat/cat
/home/nat/cat

Infelizmente, não posso usar realpath -s para isso, pois não está disponível por padrão no OSX.

    
por Will Da Silva 22.11.2018 / 18:00

1 resposta

2

É assim que sua função imaginária pode parecer materializada:

abs () {
  local _PWD _BN
  [ -d "${1}" ] && _PWD="${1}"
  [ -f "${1}" ] && { _PWD=$(dirname "${1}") ;  _BN=/$(basename "${1}") ;}
  pushd $_PWD >/dev/null
  echo $(pwd)${_BN}
  popd >/dev/null
}

Você pode passar o caminho do arquivo ou diretório como parâmetro. Em seguida, ele irá para o caminho especificado e imprimirá o diretório de trabalho, e é isso que você deseja. Você pode querer adicionar algumas validações em relação a parâmetros vazios, caminhos inexistentes ou permissões insuficientes, etc. de acordo com suas necessidades específicas - omiti isso neste exemplo.

o par pushd/popd executa o salto para o alvo e volta

>/dev/null impede que esses comandos imprimam na pilha de diretórios o que eles fazem por padrão e isso estragaria a saída desejada

    
por 22.11.2018 / 19:42