我遇到了一个酷道,它通过向.bashrc文件中添加一个函数来提升一个以上的目录级别。
只需打开.bashrc文件并插入函数即可:
#user defined functions
function cd_up() {
cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'我想知道怎么读。
它是用什么语言写的?
发布于 2021-05-17 10:56:18
.bashrc的内容是由Bash本身执行的,就像它执行脚本的方式一样,或者任何交互的shell都会被输入。它是POSIX shell语言的一个变体,有许多扩展(有些是从其他shell借用的,主要是Ksh,有些是由Bash自己创建的)。
在这里,function cd_up() { ... ; }定义了一个函数。这方面的标准表单是cd_up() { ... ; },没有function关键字。$(...)是一个命令替换,它在内部运行命令,并将其输出作为命令行参数。
printf "%0.s../"是这里的诀窍。printf使用一个格式字符串(类似于C函数printf() )和一些使用该格式字符串打印的参数。重要的是,它还尽可能多地重复格式字符串,以使用所有参数(C函数没有也不能这样做)。说明符%0.s告诉将参数打印为零宽度的字符串,因此实际上不打印参数。
但是常数部分../为每个参数打印一次,这意味着printf "%0.s../" a b将打印它两次,等等。$(seq 1 $1)是另一个命令替换,由于seq打印了一个数字列表,所以它用于向printf提供所需的参数数量。$1是当前函数cd_up的第一个参数。
因此,例如cd_up 2,将首先运行seq 1 2,它将打印1 2。这将作为参数传递给printf,因此您将得到打印../../的printf "%0.s../" 1 2。这将传递给cd,并运行cd ../../,在目录树中上升两个级别。
使用set -x,您可以看到shell实际运行的命令。Bash甚至用+符号表示嵌套级别:
/tmp/foo$ set -x
/tmp/foo$ cd_up 2
+ cd_up 2
+++ seq 1 2
++ printf %0.s../ 1 2
+ cd ../../
/$请注意,seq的输出实际上并不重要,只是其中有正确的字数。由于没有引用命令替换,所以输出通过分词,这意味着它在空格上被拆分为多个参数。printf "%0.s../" "$(seq 1 $1)"总是在格式字符串之后传递一个参数。(请参阅链接页面上的示例。)
用更少的技巧编写类似函数的另一种方法是一个简单的循环。几乎在POSIX sh中(local不是POSIX):
cd_up() {
local i=$1
while [ "$i" -gt 0 ]; do
cd ..
i=$((i - 1))
done
}或者在Bash/Zsh中,使用用于循环的算法:
cd_up() {
local i
for (( i=$1; i > 0; i-- )); do
cd ..
done
}尽管使用printf的版本更好,因为它只运行cd一次,所以cd -返回到原始目录,而不是中间目录。(将其作为练习进行修正。)
有关shell语言的资源,请参见。
发布于 2021-05-17 10:30:12
bashrc是一个bash脚本,每当bash以交互方式启动时,它都会运行。
https://unix.stackexchange.com/questions/650036
复制相似问题