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

dig*_*ang 1 linux bash shell

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

function mkdircd () {
    mkdir -p "$@" && eval cd "\"\$$#\"";
}
Run Code Online (Sandbox Code Playgroud)

eval是一个命令,但符号结尾的含义是什么?--->cd "\"\$$#\""

$mkdir -p /tmp/foo/bar/
$cd /tmp/foo/bar
$pwd
/tmp/foo/bar
Run Code Online (Sandbox Code Playgroud)

将此函数添加到.bashrc中

$mkdircd /tmp/foo/bar/
$pwd
/tmp/foo/bar/
Run Code Online (Sandbox Code Playgroud)

Alf*_*lfe 6

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

这种双重评估(shell变量替换,转义等)会夸大语法,所以看起来像是乱码.

cd "\"\$$#\""
Run Code Online (Sandbox Code Playgroud)

评估为

cd "$4"
Run Code Online (Sandbox Code Playgroud)

(假设那$#4).而且,当eval它运行时,将评估为

cd /my/new/path
Run Code Online (Sandbox Code Playgroud)

(假设那$4/my/new/path).

为什么那$#件事?因为你的shell函数会创建你传递给它的所有路径,然后尝试cd进入最后给定的路径($4如果给出了四个路径).

  • @RedX:但这不是OP给出的.你错过了第一美元之前的逃脱 (3认同)