Портативно, PWD
переменная установлена оболочкой на одно абсолютное местоположение текущего каталога. Любой компонент того пути может быть символьной ссылкой.
case $f in
/*) absolute=$f;;
*) absolute=$PWD/$f;;
esac
Если Вы хотите устранить .
и ..
также, изменитесь на каталог, содержащий файл, и получите $PWD
там:
if [ -d "$f" ]; then f=$f/.; fi
absolute=$(cd "$(dirname -- "$f")"; printf %s. "$PWD")
absolute=${absolute%?}
absolute=$absolute/${f##*/}
Нет никакого портативного способа перейти по символьным ссылкам. Если у Вас есть путь к каталогу, то на большинстве нельдов $(cd -- "$dir" && pwd -P 2>/dev/null || pwd)
обеспечивает путь, который не использует символьные ссылки, потому что оболочки, которые отслеживают символьные ссылки, имеют тенденцию реализовывать pwd -P
(“P” для “физического”).
Некоторые нельды обеспечивают утилиту для печати “физического” пути к файлу.
readlink -f
также как и FreeBSD ≥8.3, NetBSD ≥4.0 и OpenBSD еще 2.2.realpath
(это также присутствует в некоторых системах Linux, и это находится в BusyBox).Если Perl доступен, можно использовать Cwd
модуль.
perl -MCwd -e 'print Cwd::realpath($ARGV[0])' path/to/file
Вероятно, оболочка Джона не /bin/bash
, но /bin/sh
. На Ubuntu это - оболочка, предназначенная для выполнения сценариев быстро без необычных интерактивных функций, таких как выпуск командной строки. Проверьте последний столбец grep john /etc/passwd
или getent passwd john
. Вы могли бы хотеть работать chsh -s /bin/bash john
изменить оболочку пользователя.
можно перейти между оболочками путем введения имени оболочки
$ bash
и в следующей строке Вы получите этот после подсказки
user@hostname$
который является оболочкой удара. Ваша клавиша со стрелкой вверх и автоматическое заполнение будут работать теперь
/bin/sh
символьная ссылка наdash
т.е./bin/dash
, таким образом, в конечном счете оболочка пользователя/bin/dash
. – Sachin Divekar 27.11.2011, 22:52