![请解释下面的 bash 函数](https://linux22.com/image/88109/%E8%AF%B7%E8%A7%A3%E9%87%8A%E4%B8%8B%E9%9D%A2%E7%9A%84%20bash%20%E5%87%BD%E6%95%B0.png)
我在网上找到了这个功能。它创建一个目录并更改目录。
但我想知道它的每一个部分。
function mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }
答案1
您可以传入名称列表。它将为每个目录创建目录,然后 cd 进入最后的一。
这个不需要eval
。我会这样写:
mkdircd () { mkdir -p "$@" && cd "${!#}"; }
${!#}
用途间接扩张:$#
是参数个数,所以${!#}
是最后一个参数的值
答案2
mkdir -p "$@"
创建名称作为参数传递的所有目录 ( $@
)。
-p
如果目录位于不存在的目录中,该选项允许递归创建目录。
eval cd "\"\$$#\""
只需转到最后一个目录:$#
为您提供传递的参数数量,从而\$$#
为您提供最后一个参数(即:您作为参数传递的最后一个目录名称)。例如,如果有三个参数$#
is 3
,则eval
运行命令cd "$3"
。
该命令实际上应该是eval cd "\"\${$#}\""
.当有 10 个以上参数时,大括号在许多 shell 中是必需的,因为许多 shell 将类似"$10"
参数 1 的值后跟字符的值0
视为参数 10 的值。