相关疑难解决方法(0)

shell 的控制和重定向操作符是什么?

我经常在网上看到用不同符号连接各种命令的教程。例如:

command1 |  command2
command1 &  command2
command1 || command2    
command1 && command2
Run Code Online (Sandbox Code Playgroud)

其他人似乎将命令连接到文件:

command1  > file1
command1  >> file1
Run Code Online (Sandbox Code Playgroud)

这些是什么?他们叫什么?他们在做什么?还有更多吗?


关于这个问题的元线程。.

shell io-redirection control-flow

353
推荐指数
3
解决办法
17万
查看次数

Shell 语法:如何正确使用 \ 来换行?

我曾经相信打破列表中线条的适当方法是

command1 && \
command2
Run Code Online (Sandbox Code Playgroud)

原来不是这样,一个不需要 \

$ [  $(id -u) -eq 1000  ] &&                                                   
> echo yes
yes
Run Code Online (Sandbox Code Playgroud)

|以同样的方式处理管道。

关于流水线和列表的 bash 手册页部分没有对此进行任何说明。因此,我的问题是:\打破长行的正确用法是什么?

bash shell-script

78
推荐指数
2
解决办法
16万
查看次数

在没有 while 循环的情况下使用 bash 的 read 内置

我已经习惯了 while 循环中bash的内置read函数,例如:

echo "0 1
      1 1
      1 2
      2 3" |\
while read A B; do
    echo $A + $B | bc;
done
Run Code Online (Sandbox Code Playgroud)

我一直在做一些make项目,拆分文件和存储中间结果变得谨慎。因此,我经常最终将单行分解为变量。虽然下面的例子效果很好,

head -n1 somefile | while read A B C D E FOO; do [... use vars here ...]; done
Run Code Online (Sandbox Code Playgroud)

这有点愚蠢,因为 while 循环永远不会运行超过一次。但没有while,

head -n1 somefile | read A B C D E FOO; [... use vars here ...]
Run Code Online (Sandbox Code Playgroud)

当我使用它们时,读取变量总是空的。我从未注意到 的这种行为read,因为通常我会使用 while 循环来处理许多类似的行。如何在没有 while 循环的情况下使用 …

bash pipe shell-script subshell read

10
推荐指数
1
解决办法
4925
查看次数

在 bash 命令替换中有多行

我在命令替换中有一个很长的 bash 命令,如下所示:

$( comaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaand )
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法将此命令分成较短的行以提高可读性,如下所示:

$( com 
   aaaaaaaaaaaaaa
   aaaaaaaaaaaaaa
   nd )
Run Code Online (Sandbox Code Playgroud)

bash shell-script

5
推荐指数
2
解决办法
1万
查看次数

如何在 Bash 函数中捕获和处理非零退出状态?

假设我有以下(毫无意义的)Bash 函数:

myfunc() {
    ls
    failfailfail
    uptime
}
Run Code Online (Sandbox Code Playgroud)

我按如下方式运行它:

myfunc || echo "Something is wrong."
Run Code Online (Sandbox Code Playgroud)

我想要发生的是ls运行(因为它应该),failfailfail不起作用(因为它不存在),并且uptime不运行。该函数的返回值将是非零的,并且将显示错误消息。返回值不必是失败命令的确切退出状态,它不应该为零。

而实际上,我得到的输出ls,其次是“-bash:failfailfail:未找到命令”,然后输出uptime。错误消息未显示,因为失败的退出状态正在被吃掉。

set -e无论是在函数内还是在调用函数的作用域内,都没有任何有用的效果。我可以让它按照我想要的方式工作的唯一方法是:

myfunc() {
    ls || return $?
    failfailfail || return $?
    uptime || return $?
}
Run Code Online (Sandbox Code Playgroud)

但这似乎非常重复和丑陋。有没有另一种方法来清理它?

bash shell-script function exit error-handling

5
推荐指数
1
解决办法
1万
查看次数

出错时跳出 while 循环

我有一个while这种形式的循环:

while :; do
   performTask1 || break
   performTask2 || break
   performTask3 || break
   ...
   performTaskX || break
done
Run Code Online (Sandbox Code Playgroud)

基本上,只要其中一项任务出错,我就想跳出循环。有更好的方法来实现这一目标吗?

我想另一种方法是:

while :; do
   performTask1 && performTask2 ... && performTaskX || break
done
Run Code Online (Sandbox Code Playgroud)

然而,这对我来说仍然很难看。

bash shell-script

5
推荐指数
1
解决办法
5629
查看次数

xkcd 通用安装脚本是个好主意吗?

今天 XKCD 发布了这个 shell 脚本

安装文件

替代文字:

失败通常不会造成任何伤害,如果它安装了多个版本,则会增加其中一个是正确的机会。(注意:'yes' 命令和 '2>/dev/null' 是推荐的添加。)

使用这样一个尝试各种可能的安装方法直到找到一个可行的安装方法的脚本是一个好主意吗?


额外问题:您能想到应该添加到此脚本中的任何其他安装方法吗?

bash shell-script software-installation package-management

4
推荐指数
1
解决办法
1674
查看次数