function mkdircd () {
mkdir -p "$@" && eval cd "\"\$$#\"";
}
cd "\"\$$#\""
$mkdir -p /tmp/foo/bar/
$cd /tmp/foo/bar
$pwd
/tmp/foo/bar
将此功能添加到.bashrc
中$mkdircd /tmp/foo/bar/
$pwd
/tmp/foo/bar/
答案 0 :(得分:6)
eval
接收字符串作为参数,并将其评估为shell命令;因此,在正常情况下,您在源代码中看到的内容将被评估两次(一次在构建eval
命令时,然后在eval
运行时再次评估)。
这种双重评估(shell变量替换,转义等)会夸大语法,所以看起来像是乱码。
cd "\"\$$#\""
评估为
cd "$4"
(假设$#
为4
)。而且,当eval
正在运行时,将评估为
cd /my/new/path
(假设$4
为/my/new/path
)。
为什么$#
的事情?因为你的shell函数会创建传递给它的所有路径,然后尝试cd
进入 last 给定路径($4
如果{{1}}给出了四条路径。)
答案 1 :(得分:0)
请注意,在bash
中,有一种更安全的方式来访问函数的 last 参数(这是eval cd "\"\$$#\""
所做的。
cd "${@: -1}"