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)。根据上下文,它通常用于表示“从标准输入而不是从文件中读取数据”,或“将行的其余部分作为数据而不是作为命令行参数处理”。
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)
&& 是逻辑与:
&& 是一种表达逻辑与的方式,这意味着只有当它的两边都为真时,整个表达式才为真。在逻辑上,据说只有当 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)