如何在 Mac OS X 上的 shell 腳本中擷取絕對檔名?

如何在 Mac OS X 上的 shell 腳本中擷取絕對檔名?

我想檢索目前執行的腳本文件的絕對檔名。鏈接也應該解決。

在 Linux 上,這似乎是這樣完成的:

$(readlink -mn "$0")

readlink似乎有效非常在 Mac OS X 上有所不同。

我讀到這是使用完成的

$(realpath $0)

在 BSD 中但這也不起作用。 Mac OS X 沒有realpath.

任何想法?

答案1

我作弊並使用 perl 來做這件事:

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

您可能會認為我只是用 Perl 編寫整個腳本,我經常這樣做,但並非總是如此。

答案2

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

答案3

這可以處理符號連結的組合,並且適用於文件和資料夾:

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

但它不支援realpath的--relative-to。這需要轉換 此處描述

答案4

另一種方法:

# Install.
brew install coreutils

# Use the GNU variant.
grealpath --help

相關內容