我正在终端中采购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文件中的内容,而不是从super.sh文件:D执行,而无需关闭终端。这就是我正在尝试执行的操作:
终端命令:
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,正如他在答案中使用大括号( )
在整个脚本中显示的那样。也可以。
source $file_path argument
该脚本在同一个shell执行我把它叫做从(什么source
呢,我一直在说...并且就像是这样的话)command || return
语句是我在终端执行文件中