Если вы хотите, чтобы cd
вел себя так, как вы ожидаете, позвоните:
cd -P c
и pwd
напечатают:
/home/user/b/c
То, что вы видите, является проблемой, вызванной тем фактом, что ваша оболочка следует неудачному решению POSIX и делает cd -L
значением по умолчанию. Это заставляет оболочку запоминать кажущееся$PWD
/home/user/c
. Поскольку команда оболочки cd..
не вызывает chdir("..")
, а сокращает значение $PWD
на один элемент, а затем chdir()
указывает на этот сокращенный путь, cd..
возвращает вас туда, откуда вы пришли.
Это угроза безопасности, так как люди склонны запускать, например,.:
ls../
и, будучи довольным результатом, можно запускать:
cd../; rm *.c
и удалите файлы, отличные от ожидаемых.
Обратите внимание, что POSIX по умолчанию смоделирован после поведения по умолчанию ksh88
, и в то же время, когда ksh представил это поведение по умолчанию, AT&T решила реализовать более безопасный вариант cd -P
в качестве значения по умолчанию в Bourne Shell.
Вот преобразование XSLT 3.0, которое выполняет свою работу.
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="ns:tag2/text()" xmlns:ns="xxxxx">
<xsl:value-of select="translate(., '" ', '')"/>
</xsl:template>
</xsl:template>
Замените xxxxx
фактическим URI пространства имен (, не показанным в вашем примере ).
Не пытайтесь обрабатывать XML на лексическом уровне с помощью инструментов, не поддерживающих -XML -, таких как sed. Мы видим сотни проблем на StackOverflow от людей, которым приходится справляться с плохим XML, неизменно создаваемым такими методами.