我有以以下内容开头的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上被观察到,但不确定是否重要。请指教。

最佳答案

罪魁祸首是cd,试试看

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

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

相关的男子重击节:

CDPATH cd命令的搜索路径。这是一个
用冒号分隔的目录列表,其中
Shell查找指定的目标目录
通过cd命令。样本值为``。:〜:/ usr''。

cd [-L | -P] [目录]

将当前工作目录更改为directory。如果
没有给出目录,HOME外壳的值
使用变量。如果外壳变量CDPATH存在,
它用作搜索路径。如果目录以斜杠开头,
不使用CDPATH。

-P选项表示不遵循符号链接;象征性的
链接缺省或带有-L选项。如果
目录为“-”,相当于$ OLDPWD。

如果使用CDPATH中的非空目录名称,或者“-”
RELEVANT-\是第一个参数,并且目录更改成功,
PARAGRAPH-/写入新工作目录的绝对路径名
到标准输出。

如果目录成功,则返回状态为零
更改,否则为非零。

OLDPWD先前由cd设置的工作目录
命令。

关于unix - `(cd X; pwd)`有时返回两行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/296519/

10-10 12:52