我正在终端中采购bash脚本,因此出现错误时退出
set -o errexit
杀死我的终端,这是非常烦人的,因为我必须关闭终端,再打开另一个终端,并重置一些变量。
到目前为止,使用
command || return
脚本中的行完全按照我想要的去做
set -o errexit
要做...但是我希望整个脚本都完成;不只是一行/命令
我有一个充满命令的文件,用于设置站点,我宁愿不执行命令||。返回
对于文件中的每一行
是否还有另一个设置选项,或者只是“返回”而不退出终端的其他选项?
-为了清楚起见,我想终止脚本,并使终端保持与按ctrl + C终止在终端中运行的服务相同的状态。command || return
做到这一点。但我不想继续|| return
处理文件中的每一行。因此,我正在寻找与相似的东西set -o errexit
,但不会导致终端关闭
---注意:创建一个包含两行的哑脚本(super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
然后放在set -o errexit
create.sh的顶部,
完全按照我的预期工作。但是,必须创建其中包含两行的文件,只是调用另一个bash脚本,而不仅仅是从终端调用它,这确实很愚蠢。g
这里有一些例子:
在super.sh中
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
在create.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
在终端:
$ bash super.sh
预期输出:
my-mac$
这行得通。多么烦人的解决方案。
理想情况下,我希望从终端而不是super.sh文件:D中执行愚蠢的super.sh文件中的内容,而不必关闭终端。这就是我正在尝试执行的操作:
终端命令:
my-mac$ source $create_path blah
在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]
然后终端被冻结。Ctrl + C不起作用,Ctrl + D也不起作用
如果不是set -o errexit
,如果我只是command || return
在create.sh文件中的任何地方使用语句,那么我将得到所需的内容,同时直接在终端上执行supser.sh中的行(而不是从终端调用super.sh)。但这也不是一个可行的解决方案。
注意:我喜欢@terdon的答案,因为它只是生成一个子shell,所以我最终只是通过脚本而不是使用终端生成sub shell,正如他在答案中使用大括号( )
在整个脚本中显示的那样。也可以。
对于我需要完成的工作(创建虚拟环境然后将其激活,然后从bash脚本安装需求),这是唯一可行的方法:
从脚本中生成一个子shell /子shell,如下所示:
stupid_file.sh
(
set -o errexit
#bunch of commands
#one line fails
)
使用以下命令运行stupid_file:
source stupid_file.sh <file arguments here> || true
结束。
**鞠躬**
(信用归Jeff和Terdon所有)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句