22 bash shell-script
我正在终端中获取 bash 脚本,因此退出时出错
set -o errexit
Run Code Online (Sandbox Code Playgroud)
杀死我的终端,这非常烦人,因为我必须关闭终端,打开另一个终端,并重置一些变量。
到目前为止,使用
command || return
Run Code Online (Sandbox Code Playgroud)
脚本中的线条正是我想要的
set -o errexit
Run Code Online (Sandbox Code Playgroud)
要做...但我希望为整个脚本完成;不只是一行/命令
我有一个文件,里面装满了用于设置站点的命令,我宁愿不执行命令 || 返回
对于文件中的每一行
是否有另一个设置选项,或其他只会“返回”而不是退出终端的选项?
--为清楚起见,我想终止脚本,并使终端保持与按 ctrl+C 终止在终端中运行的服务相同的状态。command || return这样做。但我不想添加到|| return文件中的每一行。所以我正在寻找类似的东西set -o errexit,不会导致终端关闭
--- 注意: 创建一个包含两行的愚蠢脚本(super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
Run Code Online (Sandbox Code Playgroud)
并放置set -o errexit在create.sh的顶部,
完全按照我的预期工作。然而,必须创建一个包含两行的文件,只是为了调用另一个 bash 脚本,而不是仅仅从终端调用它,这真的很愚蠢。呜呜呜
下面是一些例子:
在超级.sh
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
Run Code Online (Sandbox Code Playgroud)
在创建.sh
#!/bin/bash
set -o errexit
#line below this is a line that fails and will cause the script to stop and return to the terminal as expected
sed "s/@@SITE_NAME@@/$dirname"
~/Desktop/site_builder/template_files/base.html > ~/Desktop/$dirname/templates/base.html # a line with a stupid error
Run Code Online (Sandbox Code Playgroud)
在终端:
$ bash super.sh
Run Code Online (Sandbox Code Playgroud)
按预期输出:
my-mac$
Run Code Online (Sandbox Code Playgroud)
这有效。多么烦人的解决方案。
理想情况下,我想从终端执行愚蠢的 super.sh 文件中的内容,而不是 super.sh 文件 :D,而无需终端关闭。这就是我正在尝试做的事情:
终端命令:
my-mac$ source $create_path blah
Run Code Online (Sandbox Code Playgroud)
在 create.sh 我还有 set -o errexit
这是终端上的输出
sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
Run Code Online (Sandbox Code Playgroud)
然后终端被冻结。Ctrl+C 不起作用,Ctrl+D 也不起作用
如果不是set -o errexit,如果我只是command || return在 create.sh 文件中到处使用语句,那么我得到了我想要的,同时直接在终端上执行 suser.sh 中的行(而不是从终端调用 super.sh)。但这也不是一个实际的解决方案。
注意:我喜欢@terdon 的关于只生成一个子 shell 的回答,所以我最终只是通过脚本而不是终端生成了一个子 shell,正如他在他的回答中使用大括号显示的那样( ),围绕整个脚本......他的回答也有效。
只需使用故障保护来获取文件:
source the-source-file || true
Run Code Online (Sandbox Code Playgroud)
...那么整个命令不会失败,即使失败source。
小智 5
这是唯一适用于我需要完成的事情(创建虚拟环境然后激活它,然后从 bash 脚本安装需求):
从脚本生成一个子shell/子shell,如下所示:
愚蠢的文件.sh
(
set -o errexit
#bunch of commands
#one line fails
)
Run Code Online (Sandbox Code Playgroud)
使用以下命令运行愚蠢的文件:
source stupid_file.sh <file arguments here> || true
Run Code Online (Sandbox Code Playgroud)
结束。
**鞠躬**
(归功于 Jeff 和 Terdon)