其实我看不懂这段代码的结尾:
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}"