function mkdircd(){mkdir -p“$ @”&& eval cd“\”\ $$#\“”; }

时间:2014-02-27 10:47:12

标签: linux bash shell

实际上,我无法理解这段代码的结尾:

function mkdircd () {
    mkdir -p "$@" && eval cd "\"\$$#\"";
}
eval是一个命令,但符号结尾的意义是什么? ---> cd "\"\$$#\""

$mkdir -p /tmp/foo/bar/
$cd /tmp/foo/bar
$pwd
/tmp/foo/bar

将此功能添加到.bashrc

$mkdircd /tmp/foo/bar/
$pwd
/tmp/foo/bar/

2 个答案:

答案 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}"