-6 bash cd-command shell-script
通过向 .bashrc 文件中添加一个函数,我发现了一种很酷的方法来提升 1 个以上的目录级别。
只需打开 .bashrc 文件并插入函数即可完成:
#user defined functions
function cd_up() {
cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'
Run Code Online (Sandbox Code Playgroud)
我想了解如何阅读它。
它是用什么语言编写的?
的内容.bashrc由 Bash 本身执行,与它执行脚本的方式相同,或者实际上是交互式 shell 提供的任何内容。它是 POSIX shell 语言的一个变体,有许多扩展(一些是从其他 shell 借来的,主要是 Ksh,一些是由 Bash 自己创建的)。
在这里,function cd_up() { ... ; }定义了一个函数。这个的标准形式是 just 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 ../../
/$
Run Code Online (Sandbox Code Playgroud)
请注意,输出是什么并不重要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
}
Run Code Online (Sandbox Code Playgroud)
或在 Bash/Zsh 中,使用算法 for 循环:
cd_up() {
local i
for (( i=$1; i > 0; i-- )); do
cd ..
done
}
Run Code Online (Sandbox Code Playgroud)
尽管 with 的版本printf更好,因为它只运行cd一次,因此cd -返回到原始目录,而不是中间目录。(修复它留作练习。)
有关 shell 语言的资源,请参见例如