Получить реальный путь в оболочке соляриса

Есть ли в Solaris утилита, которая может получить реальный путь.

cd /home/me/test
realpath ..  # got /home/me in linux

Я могу сделать RealPath в Linux, но, кажется, не хватает Solaris.

3 ответа

Решение
function realpath {
  [ -d "$1" ] && (
      CDPATH= \cd "$1"
      /bin/pwd
  ) || (
      CDPATH= \cd "$(dirname "$1")" &&
          printf "%s/%s\n" "$(/bin/pwd)" "$(basename $1)"
  )
}

Некоторые комментарии:

Хотя функция не POSIX, рекомендуется использовать ее вместо прежней name() { ... } синтаксис по крайней мере на ksh, который, вероятно, является наиболее используемой оболочкой в ​​Solaris.

\cd используется против cd чтобы предотвратить что-то еще, чем cd встроенная оболочка для использования, а затем избежать нежелательных побочных эффектов./bin/pwd используется для вызова pwd как не встроенная команда, потому что она не имеет представления о том, как родительская оболочка перешла в текущий каталог, и поэтому может получить только реальный путь к ней.

Я знаю, что это старые вопросы и ответы, но мне кажется, что предлагаемая функция realpath имеет два недостатка. Во-первых, он изменяет текущий рабочий каталог, что может быть неожиданно после одного (или нескольких) вызовов функции. Два, кажется, работает только для путей к каталогам. Следующее может быть более общей функцией (я пользователь bash и мне это нужно только для скриптов, поэтому я пропустил обратную косую черту.)

function realpath {
    local base=$(basename $1)
    local d=$(dirname $1)
    (cd $d ; echo $(/bin/pwd)/$base)
}

Я столкнулся с этим на платформе Solaris 10, и вот ответы найдены (включая упрощенную версию ответа jlliagre)

Полный путь с символическими ссылками разрешен:

  • / usr / bin / pwd -P
  • / bin / pwd (Спасибо: jlliagre)
  • realpath {linux}

Полный путь без символических ссылок разрешен:

  • / USR / бен / PWD

Вопрос, который нужно задать себе: $(который pwd)?

Другие вопросы по тегам