我们的目录结构类似于
/long/dir/name/bin/exec.sh
/long/dir/name/logs
/long/dir/name/input
/long/dir/name/output.
在exec.sh中我想检索根目录(在这种情况下为/long/dir/name
),将其存储在变量中,以便我可以使用它来引用$DIR/output
,$DIR/input
等。
我到[exec.sh]:
#!/bin/sh
export DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" | sed -e 's,/*[^/]\+/*$,,'
echo "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" | sed -e 's,/*[^/]\+/*$,,'
echo "My Dir: '$DIR'"
输出:
/long/dir/name <-- Which is what I want
My Dir: ''
将它分配给DIR变量时会出现什么问题?
答案 0 :(得分:3)
回答&#34;出了什么问题&#34;问题
您将管道粘贴到<{1}} 外部子区域以进行分配(从技术上讲,sed
不是一项调用export var=...
的分配(请参阅ksh get exit status in assignment作为示例)。
无论如何,第一行发生的事情就是shell看到
export
export DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
(注意管道周围的空白)。并且管道在子shell中执行,因此您的sed -e 's,/*[^/]\+/*$,,'
发生在su-shell中,然后丢失。
将export
粘贴在子shell中,然后解决问题。
sed
答案 1 :(得分:2)
我想你想要这个:
DIR=${BASH_SOURCE%/*/*}
也就是说,从脚本自己的路径中删除最后两个路径部分,并使用它。如果您需要获得规范路径,请通过realpath
或readlink -f
运行。