Переменная $PWD, эквивалентная из pwd-P

Я закончил тем, что установил isc-dhcp-client, кажется, решает проблему. Спасибо за все другие подсказки, хотя!

2
15.08.2013, 18:45
3 ответа

В оболочках POSIX, после

cd -P .

$PWD будет содержать путь без символьных ссылок.

В zsh, $PWD:A расширится до версии без символьных ссылок $PWD (работы для любой переменной, не просто $PWD).

В zsh, setopt chase_links, и в tcsh, set symlinks = chase, причина cd удостоверяться $PWD без символьных ссылок. Однако тот единственные работы после первого cd. В zsh, cd . сделает $PWD бесплатная символьная ссылка, но не в tcsh где Вам было бы нужно cd "$cwd" (который, как гарантируют, не будет работать).

4
27.01.2020, 21:54
  • 1
    я не должен изменять каталог, я думал, что уже была переменная для этого. –  Brian Postow 15.08.2013, 19:18
  • 2
    @BrianPostow - не, что я когда-либо видел. Существует $CWD, но он переносит ту же проблему. –  slm♦ 15.08.2013, 19:20
  • 3
    @BrianPostow, cd ., по определению, не изменяет каталог. –  Stéphane Chazelas 15.08.2013, 23:19
  • 4
    cd-P, кажется, даже при том, что Вы находитесь в том же физическом dir, логических изменениях пути. Можно использовать pushd и popd для противостояния этому. –  Jamie Pate 22.09.2014, 22:39

К моему знанию нет такой переменной, обеспеченной средой, которая гарантирует, что ее значение является физическим путем и не связанной версией.

Учитывая это Ваши опции ограничены выбором, который Вы уже упомянули плюс следующая альтернатива.

readlink

Можно использовать команду readlink для получения физического каталога/файла, на который указывает символьная ссылка:

Пример

демонстрационные данные:

$ ln -s /usr/bin/ack ack

$ ls -l |grep ack
lrwxrwxrwx   1 saml saml        12 Aug 15 11:48 ack -> /usr/bin/ack

физическое местоположение:

$ readlink ./ack
/usr/bin/ack
$ readlink /home/saml/ack 
/usr/bin/ack
$ readlink $HOME/ack
/usr/bin/ack

Если значение Вы передаете readlink не ссылка, она ничего не возвратит. Можно вынудить это возвратить каноническое значение при помощи -f переключатель:

$ echo $PWD
/home/saml

$ readlink -f $PWD
/home/saml

Ссылки

1
27.01.2020, 21:54
  • 1
    команда не помогает никому. Если бы я хотел команду, то я мог бы просто использовать/bin/pwd или pwd-P. Я хочу переменную. –  Brian Postow 15.08.2013, 19:18
  • 2
    Никакая переменная не существует в способе, которым Вы хотите это. См. ответ @StephaneChazelas также. Он скажет Вам то же самое. –  slm♦ 15.08.2013, 19:19

Если Вы используете ksh93, существует простой способ реализовать ту переменную. Просто добавьте эту функцию дисциплины или в начале Вашего сценария или в начале быть полученным им:

function PWDP.get
{
  .sh.value=$(pwd -P)
}

Затем можно просто использовать переменную PWDP, как Вы ожидаете:

$ mkdir /tmp/foo
$ ln -s /tmp/foo /tmp/bar
$ cd /tmp/bar
$ echo $PWD
/tmp/bar
$ echo $PWDP
/tmp/foo

Редактирование, "немного" более сложное решение, пытающееся обработать точку Stéphane Chazelas:

function PWDP.get
{
    typeset p=$(pwd -P; echo .)
    .sh.value=${p%??}
}
1
27.01.2020, 21:54
  • 1
    как маленькое примечание: это не работает, если (физический) текущий каталог заканчивается в символах новой строки. –  Stéphane Chazelas 21.08.2013, 16:49
  • 2
    @StephaneChazelas обновил с чем-то для предотвращения этой точки, но я не сомневаюсь, что Вы найдете больше проблем с ним... –  jlliagre 21.08.2013, 23:59
  • 3
    Ай. Да, я обновил с более простой и более надежной альтернативой. Надежда Вы не возражаете. –  Stéphane Chazelas 22.08.2013, 00:08
  • 4
    @StephaneChazelas, Намного более простой действительно, Спасибо! –  jlliagre 22.08.2013, 00:10

Теги

Похожие вопросы