cd `(反引号)的目的是什么?

Moo*_*man 56 linux bash

以下在 Fedora 和 CentOS 中的行为相同。

cd mydirectory
Run Code Online (Sandbox Code Playgroud)

作品。

cd notadirectory
Run Code Online (Sandbox Code Playgroud)

有效(从 Bash 获取错误)。

然而,

cd `
Run Code Online (Sandbox Code Playgroud)

给了我某种提示:

>
Run Code Online (Sandbox Code Playgroud)

我想输入的任何内容都没有给出任何响应,它只是转到下一行再次提示。我只是使用CTRL+C退出回到我的root@localhost.

这样做的目的是什么,人们可以用它做什么?

谢谢!

小智 123

您输入的是反引号- 它是 bash 评估您作为命令输入的内容的指令的开始。该>显示指示你还在下一行输入命令。

如果关闭反引号,您会发现整个命令都将运行。例如

~$ cd `
> echo /var`
/var$
Run Code Online (Sandbox Code Playgroud)

  • @MSalters 您可能偶然发现了现代 bash 更喜欢“$()”而不是“\`\”的原因。你的例子(加上正确的引用)将变成`cd "$(dirname "$(which ls)")"`,这就不那么疯狂了。 (54认同)
  • @Muzer 不仅仅是 bash 喜欢它,而且 [POSIX 规范中推荐使用它](http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html#tag_23_02_06_03) 使用 `$()`反引号。 (31认同)
  • 你甚至可以嵌套它们。举一个比较现实的例子:`cd \`dirname \\`which ls\\`\`` = cd 到“ls”二进制文件所在的目录。(即`cd /bin`,因为它是`/bin/ls`)[编辑:呸,逃避那个降价是很难的] (17认同)

Tob*_*ler 59

JohnC 的回答已经解释了反引号。但是您还想知道的是>提示。这是一个继续提示,它不仅由反引号触发,而且总是在您的 shell 清楚地知道您没有完成输入命令时触发。最简单的例子是\在输入行的末尾放置一个显式的续行(这有助于拆分长输入):

$ echo \
> hallo
Run Code Online (Sandbox Code Playgroud)

请注意,就像PS1控制命令提示符的外观一样,您也可以设置PS2更改继续提示符,例如

$ export PS2="(cont.) "
$ echo \
(cont.) hallo
Run Code Online (Sandbox Code Playgroud)

持续发生的原因有很多。单个反引号是不完整的,但您也可以输入类似

ls -l `which cp`
Run Code Online (Sandbox Code Playgroud)

在一行中(旁注:建议使用$(and)代替,因为括号使扩展开始和结束的位置一目了然,而单个反引号使您更难看到缺少的位置。和嵌套......)。继续提示的其他可能原因:

  • 失踪donewhilefor
  • 一个失踪fiif
  • 失踪esaccase
  • 缺少右括号,例如在子外壳中 (cd $HOME; cat .bashrc)
  • 管道后失踪命令|以及条件执行||&&(未&不过,因为这只是做在后台运行的命令)
  • 缺少结束语('"

奇怪的是,}变量展开后缺少大括号${也会导致继续提示,但会因插入空格而失败:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution
Run Code Online (Sandbox Code Playgroud)

  • 使用引号时也会发生同样的事情:) (2认同)