`(cd X; pwd)` иногда возвращает две строки - PullRequest
3 голосов
/ 17 ноября 2008

У меня есть сценарий оболочки, который начинается с:

sdir=`dirname $0`
sdir=`(cd "$sdir/"; pwd)`

И это обычно расширяется (с 'sh -h') в

++ dirname /opt/foo/bin/bar
+ sdir=/opt/foo/bin
++ cd /opt/foo/bin/
++ pwd
+ sdir=/opt/foo/bin

, но для одного пользователя для единственной комбинации параметров в расширяется (обратите внимание на две строки в значении sbin результата)

++ dirname bin/foo
+ sdir=bin
++ cd bin/
++ pwd
+ sdir='/opt/foo/bin
/opt/foo/bin'

Я пробовал разные комбинации, но не смог воспроизвести это поведение. При разных входных параметрах для этого пользователя он начал давать правильный однострочный результат. Я новичок в сценариях оболочки, поэтому, пожалуйста, совет, когда такой (cd X; pwd) может вернуть две строки. это наблюдалось на CentOS, но не уверен, что это имеет значение. Пожалуйста, совет.

Ответы [ 5 ]

5 голосов
/ 17 ноября 2008

Виновником является cd, попробуйте вместо этого

sdir=`dirname $0`
sdir=`(cd "$sdir/" >/dev/null; pwd)`

Это происходит потому, что когда вы указываете не абсолютный путь и каталог находится в переменной окружения CDPATH, cd печатает для вывода значения абсолютного пути к каталогу, на который он был изменен.

Соответствующие разделы man bash:

       CDPATH The  search  path  for  the  cd command.  This is a
              colon-separated list of directories  in  which  the
              shell  looks  for destination directories specified
              by the cd command.  A sample value is ``.:~:/usr''.

       cd [-L|-P] [directory]

              Change the current working directory to directory. If 
              directory is not given, the value of the HOME shell 
              variable is used. If the shell variable CDPATH exists,
              it is used as a search path. If directory begins with a slash, 
              CDPATH is not used.

              The -P option means to not follow symbolic links; symbolic 
              links are followed by default or with the -L option. If 
              directory is ‘-’, it is equivalent to $OLDPWD.

              If a non-empty directory name from CDPATH is used, or if ‘-’ 
RELEVANT  -\  is the first argument, and the directory change is successful, 
PARAGRAPH -/  the absolute pathname of the new working directory is written 
              to the standard output.

              The return status is zero if the directory is successfully 
              changed, non-zero otherwise. 

       OLDPWD The  previous  working  directory  as set by the cd
              command.

1 голос
/ 19 ноября 2008

CDPATH - распространенная ошибка. Вы также можете использовать «unset CDPATH; экспорт CDPATH», чтобы избежать проблемы в вашем скрипте.

0 голосов
/ 25 мая 2009

Попробуйте это:

sdir=$( cd $(dirname "$0") > /dev/null && pwd )

Это всего лишь одна строка, и все специальные символы в имени каталога будут сохранены. Помните, что в Unix только два символа недопустимы в имени файла / каталога: 0-байтовый и / (косая черта). Особенно, новые строки действительны в имени файла!

0 голосов
/ 17 ноября 2008

Некоторые люди называют псевдоним "echo $ PWD". Кроме того, сама команда pwd может быть встроенной в оболочку или программой в / usr / bin. Выполните «псевдоним pwd» и «which pwd» как для этого пользователя, так и для любого пользователя, который работает нормально.

0 голосов
/ 17 ноября 2008

Возможно, у пользователя есть какой-то прикольный псевдоним для "cd". Возможно, вы могли бы попробовать сделать так, чтобы он выполнял "/ usr / bin / cd" (или любой другой "cd" на самом деле работает по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...