`(cd X; pwd)`有时会返回两行

时间:2008-11-17 19:06:39

标签: unix shell

我的shell脚本以:

开头
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'

我尝试了不同的组合,但无法重现此行为。通过该用户的不同输入参数,它开始产生正确的单行结果。我是shell脚本的新手,所以当这样的(cd X; pwd)可以返回两行时请提供建议。 它是在CentOS上观察到的,但不确定它是否重要。请指教。

5 个答案:

答案 0 :(得分:5)

罪魁祸首是cd,试试这个

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

发生这种情况是因为当您指定非绝对路径并且在环境变量CDPATH中找到该目录时,cd会将stdout打印到它更改为的目录的绝对路径的值。

相关人员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 :(得分:1)

CDPATH是一个常见问题。您还可以使用“unset CDPATH; export CDPATH”来避免脚本中的问题。

答案 2 :(得分:0)

用户可能对“cd”有一些时髦的别名。也许您可以尝试将其设置为“/ usr / bin / cd”(或者默认情况下“cd”实际上运行)。

答案 3 :(得分:0)

有些人将pwd称为“echo $ PWD”。此外,pwd命令本身可以是内置shell,也可以是/ usr / bin中的程序。在该用户和任何正常工作的用户上执行“alias pwd”和“which pwd”。

答案 4 :(得分:0)

试试这个:

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

它只是一行,并且会保留目录名中的所有特殊字符。请记住,在Unix上,文件/目录名中只有两个字符是非法的:0字节和/(正斜杠)。特别是,换行符在文件名中有效!