我有更大的shell脚本来处理不同的东西.
它会通过以下方式获得它自己的位置......
BASEDIR=`dirname $0`/..
BASEDIR=`(cd "$BASEDIR"; pwd)`
Run Code Online (Sandbox Code Playgroud)
然后将使用BASEDIR创建其他变量
REPO="$BASEDIR"/repo
Run Code Online (Sandbox Code Playgroud)
但问题是如果路径包含当前执行的空格,则此shell脚本不起作用.
所以问题是:是否存在解决该问题的良好解决方案?
请务必双引用任何可能包含空格的内容:
BASEDIR="`dirname $0`"
BASEDIR="`(cd \"$BASEDIR\"; pwd)`"
Run Code Online (Sandbox Code Playgroud)
答案是"到处都是行情".
如果您传入的路径中有空格,dirname $0则会失败.
$ cat quote-test.sh
#!/bin/sh
test_dirname_noquote () {
printf 'no quotes: '
dirname $1
}
test_dirname_quote () {
printf 'quotes: '
dirname "$1"
}
test_dirname_noquote '/path/to/file with spaces/in.it'
test_dirname_quote '/path/to/file with spaces/in.it'
$ sh quote-test.sh
no quotes: usage: dirname string
quotes: /path/to/file with spaces
Run Code Online (Sandbox Code Playgroud)
另外,试试这个有趣的例子
#!/bin/sh
mkdir -p /tmp/foo/bar/baz
cd /tmp/foo
ln -s bar quux
cd quux
cat >>find-me.sh<<"."
#!/bin/sh
self_dir="$(dirname $0)"
base_dir="$( (cd "$self_dir/.." ; pwd -P) )"
repo="$base_dir/repo"
printf 'self: %s\n' "$self_dir"
printf 'base: %s\n' "$base_dir"
printf 'repo: %s\n' "$repo"
.
sh find-me.sh
rm -rf /tmp/foo
Run Code Online (Sandbox Code Playgroud)
运行时的结果:
$ sh example.sh
self: .
base: /tmp/foo
repo: /tmp/foo/repo
Run Code Online (Sandbox Code Playgroud)