Como posso recuperar o nome de arquivo absoluto em um script de shell no Mac OS X?

Como posso recuperar o nome de arquivo absoluto em um script de shell no Mac OS X?

Gostaria de recuperar o nome absoluto do arquivo de script que está sendo executado no momento. Os links também devem ser resolvidos.

No Linux, isso parece ser feito assim:

$(readlink -mn "$0")

mas readlinkparece funcionarmuitodiferentemente no Mac OS X.

Eu li que isso é feito usando

$(realpath $0)

no BSD, mas isso também não funciona. O Mac OS X não possui realpath.

Qualquer ideia?

Responder1

Eu trapaceio e uso perl exatamente para isso:

#!/bin/bash
dirname=`perl -e 'use Cwd "abs_path";print abs_path(shift)' $0`
echo $dirname

Você pensaria que eu escreveria o script inteiro em perl, e muitas vezes o faço, mas nem sempre.

Responder2

#!/usr/bin/env bash
scriptDir="$(cd "$(dirname "$0")" && pwd -P)"

Responder3

Isso lida com combinações de links simbólicos e funciona em arquivos e pastas:

#!/usr/bin/env bash
realpath()
{
    if ! pushd $1 &> /dev/null; then 
        pushd ${1##*/} &> /dev/null
        echo $( pwd -P )/${1%/*}
    else
        pwd -P
    fi
    popd > /dev/null
}

Mas não suporta --relative-to do realpath. Isso exigiria a conversão descrito aqui.

Responder4

Outra abordagem:

# Install.
brew install coreutils

# Use the GNU variant.
grealpath --help

informação relacionada