Linux Bash 语法:&&、\ 和 - 的含义

Ale*_*lex 22 linux bash

bash 命令末尾的“ &&”、“ \” 和“ -” 是什么意思?

特别是,我遇到了以下应该将公钥添加到 Ubuntu 的 aptitude 包管理器的行组合,这些字符在这里用于什么?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key 添加 - && \
    sudo apt-get 更新

gol*_*udo 46

“&&”用于将命令链接在一起,以便当且仅当前一个命令无错误退出(或更准确地说,以返回码 0 退出)时才运行下一个命令。

行尾的“\”本身是将行连接在一起的一种方式。所以下面两行:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075
Run Code Online (Sandbox Code Playgroud)

处理方式与将行写为单行完全相同:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075
Run Code Online (Sandbox Code Playgroud)

“-”是一个命令行参数,没有特定的 bash 函数。它的确切处理方式取决于正在运行的命令(在本例中为apt-key)。根据上下文,它通常用于表示“从标准输入而不是从文件中读取数据”,或“将行的其余部分作为数据而不是作为命令行参数处理”。

  • 在这种情况下,'-' 不是 sudo 的参数,而是 'apt-key' 的参数,这意味着 'apt-key' 使用通过管道 ('|') 到达其标准输入的数据,而不是密钥文件作为钥匙。“gpg --export”选项,没有“--output a_file_name.key”,将新密钥从gpg stdout中推出,通过管道('|')到'apt-key'的stdin 简单:- ) (6认同)
  • 哎呀。这就是我在半睡半醒时回答问题的结果。固定的。 (2认同)

rod*_*jek 11

&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)
Run Code Online (Sandbox Code Playgroud)


Kyl*_*ndt 6

&& 是逻辑与:
&& 是一种表达逻辑与的方式,这意味着只有当它的两边都为真时,整个表达式才为真。在逻辑上,据说只有当 P 和 Q 都为真时,整个语句 (P&Q) 才为真。

因此,计算机通常将 P&Q 视为短路评估。因此,由于只有当 P 和 Q 都为真时,整个语句才会为真,那么如果 P 为假,则不会对语句 Q 求值。基本上计算机是懒惰的(高效的),如果它们没有,也不要费心评估 Q。这也是逻辑 OR 的 True,请参阅上一个链接。

Bash 中 && 的三个上下文:

1) 使用具有命令退出状态的短路评估:
每个命令都有一个退出状态。如果命令有错误,则它的退出状态不为零。因此,如果退出状态为非零且 && 用于将命令链接在一起形成一个语句,则如果较早的命令的退出状态不为 0 (True),则不会评估(执行)后面的命令。这是因为短路评估。所以如果你有:

P && Q
Run Code Online (Sandbox Code Playgroud)

如果 P 不为真,Q 将不会被执行(如果 P 以除 0 以外的任何状态退出,则它不为真)。与以下相同:

./configure && make
Run Code Online (Sandbox Code Playgroud)

如果 configure 有错误,则不会执行 make,这不是真的。所以基本上, then 最终成为一种写 if then 语句的方式:

if ./configure ; then
   make
fi
Run Code Online (Sandbox Code Playgroud)

请记住,在大多数情况下,0 为假,但在退出状态时则不然。

2) && 可以在 Bash 内置的 [[ ]] 测试命令中使用:

&& 也可以在 bash [[ ]] 的内置测试命令中使用,以与组合命令类似的方式组合表达式。只有当 && 的两个操作数(边)都为真时,整个测试操作才会为真,例如:

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 
Run Code Online (Sandbox Code Playgroud)

如果 $a 是 2 到 5 之间的整数(不包括 2 和 5),这将是一种说法。

3)算术评估:

最后,&& 可以在算术评估中用作逻辑与。如果以下数字的两个(逻辑与)非零,则返回 0,否则返回 1:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0
Run Code Online (Sandbox Code Playgroud)