Получить реальный путь в оболочке соляриса
Есть ли в 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)?