我的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上观察到的,但不确定它是否重要。请指教。
答案 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字节和/
(正斜杠)。特别是,换行符在文件名中有效!