set -o pipefail用来解决这种情况,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行。 #!/usr/bin/env bash set -eo pipefail foo | echo a echo bar 运行后,结果如下。 $ bash script.sh a script.sh:行4: foo: 未找到命令 可以看到,echo bar没有执行。 七、总结 set命令的上面这四个参数,...
也就是说,只要最后一个子命令不失败,管道命令总是会执行成功,因此它后面命令依然会执行,set -e就失效了。 请看下面这个例子。 #!/usr/bin/env bashset-e foo |echoaechobar 执行结果如下。 $ bash script.sh a script.sh:行4: foo: 未找到命令 bar 上面代码中,foo是一个不存在的命令,但是foo | ech...
set -e从根本上解决了这个问题,它使得脚本只要发生错误,就终止执行。 -e还有另一种写法-o errexit。 set -o errexit 1. #!/usr/bin/env bash set -e foo echo bar 执行结果如下。 $ bash script.sh script.sh:行4: foo: 未找到命令 1. 2. 3. ...
用法1: 假设你的入口脚本是 myscript.sh,可以新建一个脚本,通过 flock 来运行它: # flock --wait 超时时间 -e 锁文件 -c "要执行的命令" # 例如: flock --wait 5 -e "lock_myscript" -c "bash myscript.sh" 用法2: 也可以在原有脚本里使用 flock。 可以把文件打开为一个文件描述符,然后使用 fl...
$ bash script.sh+echobar bar 可以看到,执行echo bar之前,该命令会先打印出来,行首以+表示。这对于调试复杂的脚本是很有用的。 -x还有另一种写法-o xtrace。 set-o xtrace 四、Bash 的错误处理 如果脚本里面有运行失败的命令(返回值非0),Bash 默认会继续执行后面的命令。
set -x用来在运行结果之前,先输出执行的那一行命令。 #!/usr/bin/env bash set -x echo bar 执行上面的脚本,结果如下。 $ bash script.sh + echo bar bar 可以看到,执行echo bar之前,该命令会先打印出来,行首以+表示。这对于调试复杂的脚本是很有用的。
用法1:假设你的入口脚本是 myscript.sh,可以新建一个脚本,通过 flock 来运行它: 用法2:也可以在原有脚本里使用 flock。可以把文件打开为一个文件描述符,然后使用 flock 对它上锁(flock 可以接受文件描述符参数)。 2. 意外退出时杀掉所有子进程 我们的脚本通常会启动好多子脚本和子进程,当父脚本意外退出时,子...
请注意:如果修改脚本的shabang为bash -x, 又以bash test.sh的方式执行脚本, 会发生什么? 居然没有输出debug信息!!! 设置shabang表示设置一个默认解释器, 如果没有指定解释器才会使用shabang设置的解释器, 以./test.sh的方式执行脚本就没有指定解释器. 以bash script.sh的方式执行脚本则指定了解释器为bash, 所以...
In a shell script: echo shell commands as they are executed set -xorset -o xtrace:Options; 错误 127 Return code from $?:命令不存在; Exit Status 退出码: If a command is not found, the child process created to execute it returns a status of 127. ...
(1)bash -x script.sh or sh -x script.sh (2)使用set -x和set +x对脚本进行部分调试。例如: #!/bin/bash #filename:debug.sh for i in {1..6}; do set -x echo $i set +x done echo "script executed" [cairui@cai shell]$ sh debug.sh ...