¿Cómo puedo recuperar el nombre de archivo absoluto en un script de shell en Mac OS X?

¿Cómo puedo recuperar el nombre de archivo absoluto en un script de shell en Mac OS X?

Me gustaría recuperar el nombre absoluto del archivo de script que se está ejecutando actualmente. Los enlaces también deberían resolverse.

En Linux, esto parece hacerse así:

$(readlink -mn "$0")

pero readlinkparece funcionarmuyde forma diferente en Mac OS X.

He leído que esto se hace usando

$(realpath $0)

en BSD pero eso tampoco funciona. Mac OS X no tiene realpath.

¿Alguna idea?

Respuesta1

Hago trampa y uso Perl para esto mismo:

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

Uno pensaría que simplemente escribiría todo el guión en Perl, y a menudo lo hago, pero no siempre.

Respuesta2

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

Respuesta3

Esto maneja combinaciones de enlaces simbólicos y funciona en archivos y carpetas:

#!/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
}

Pero no es compatible con --relative-to de realpath. Esto requeriría la conversión descrito aquí.

Respuesta4

Otro enfoque:

# Install.
brew install coreutils

# Use the GNU variant.
grealpath --help

información relacionada