Когда я пытаюсь найти текущий рабочий каталог в командной строке Linux (используя «pwd»), он покажет каталог с включенными символическими ссылками. Например, если я создаю символическую ссылку и использую ее для посещения этого каталога:
ln -s /mnt/backup /home/biotech/backup
cd /home/biotech/backup
pwd
Будет показано «/ home / biotech / backup» вместо «/ mnt / backup». Это происходит как в Ubuntu, так и в Cygwin.
Какую команду я могу использовать, чтобы увидеть последний, «настоящий» каталог?
возможно:
pwd -P
из справки:
«-P: принтер с указанием пути не будет содержать символических ссылок».
Чтобы решить эту проблему для общего случая (т.е. не только для текущего каталога), используйте:
readlink -f PATH
/bin/pwd
Он не знает, где вы были и как попали туда, поэтому он исходит из первых принципов.
Из ракушки.
pwd -P
Из пользовательской среды.
/bin/pwd
Чтобы получить более портативный (POSIX-совместимый) pwd -P
команда, мы могли бы использовать обычную встроенную оболочку command
:
# cf. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_06
command -p pwd -P
#builtin command -p pwd -P
#alias pwd=echo; PATH="$(command -p getconf PATH)" 'pwd' -P
В windows7 я использую cmd с многочисленными жесткими ссылками NTFS на папки, cygwin, bash и perl находятся на моем пути, но pwd -P не работает, как было предложено выше. Этот скрипт проходит вверх по дереву и удаляет ссылки на realdir:
CHN=$(cygpath -wam .)
echo $CHN
while true ;do
OLD=$DIR
DIR=$(cygpath -wam .)
if [[ ( -n "$OLD" ) && !( $OLD =~ $DIR* )]] ;then
SYM=$DIR/${OLD##*/}
CHN=$(echo $CHN | perl -lpe "s,$OLD,$SYM,")
echo $CHN
fi
case $DIR in [A-Z]:/ | [A-Z]:/cyg* ) break ;; esac # TOPLEVEL
cd $DIR/..
done