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



其实我看不懂这段代码的结尾:

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/

eval接收一个字符串作为参数,并将其作为shell命令进行评估;因此在正常情况下,您在源代码中看到的内容被计算两次(一次在构建eval命令时,然后在eval运行时再次计算)。

这种双重计算(shell 变量替换、转义等)稍微破坏了语法,所以看起来很胡言乱语。

cd ""$$#""

评估结果为

cd "$4"

(假设$#4)。 并且,当eval运行时,将计算为

cd /my/new/path

(假设$4/my/new/path)。

为什么$#这样的事情? 因为你的 shell 函数将创建你传递给它的所有路径,然后尝试cd最后一个给定的路径(如果给定了四个路径,则$4)。

请注意,在 bash 中,有一种更安全的方式来访问函数的最后一个参数(这就是eval cd ""$$#""所做的。

cd "${@: -1}"

最新更新