Назад | Перейти на главную страницу

Как найти актуальный рабочий каталог?

Когда я пытаюсь найти текущий рабочий каталог в командной строке 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