是否有类似于pipefail的多个命令,比如'try'语句但在bash中.我想做这样的事情:
echo "trying stuff"
try {
command1
command2
command3
}
Run Code Online (Sandbox Code Playgroud)
并且在任何时候,如果任何命令失败,则退出并回显该命令的错误.我不想做以下事情:
command1
if [ $? -ne 0 ]; then
echo "command1 borked it"
fi
command2
if [ $? -ne 0 ]; then
echo "command2 borked it"
fi
Run Code Online (Sandbox Code Playgroud)
等等......或类似的东西:
pipefail -o
command1 "arg1" "arg2" | command2 "arg1" "arg2" | command3
Run Code Online (Sandbox Code Playgroud)
因为我相信的每个命令的参数(如果我错了,纠正我)会相互干扰.这两种方法对我来说似乎非常啰嗦和讨厌,所以我在这里呼吁采用更有效的方法.
可能重复:
bash中"$ @"和"$*"之间的区别是什么?
多年来,我曾多次在shell脚本的使用$*和犹豫之间犹豫不决$@.已经读了bash的手册页的适用部分,一遍又一遍,已经尝试都$*和$@我或多或少完全无法理解两个变量之间的应用程序的实际差别.你能告诉我吗?
我$*最近一直在使用,但不要问我为什么.我不知道为什么,因为我不知道为什么$@甚至存在,除了作为一个几乎完全的同义词$*.
有什么实际区别吗?
(我个人倾向于使用Bash,但对shell的选择保持不可知.就我所知,我的问题并不是Bash特有的.)
我知道有几个SO问题exit与return在bash脚本(如这里)。
在这个主题上,但与现有问题不同,我相信,我想知道是否有“最佳实践”来安全地从bash脚本中实现“提前返回”,这样用户的当前 shell 就不会退出,如果他们源脚本。
像这样的回答这似乎是以“ exit”,但如果脚本来源,即具有运行“ .”(点间隙)前缀,在脚本运行电流外壳的情况下,在这种情况下,exit声明有退出的效果当前外壳。我认为这是一个不受欢迎的结果,因为脚本不知道它是来自还是在子 shell 中运行——如果是前者,用户可能会意外地让他的 shell 消失。如果调用者提供它,是否有提前返回的方法/最佳实践不退出当前 shell?
例如这个脚本...
#! /usr/bin/bash
# f.sh
func()
{
return 42
}
func
retVal=$?
if [ "${retVal}" -ne 0 ]; then
exit "${retVal}"
# return ${retVal} # Can't do this; I get a "./f.sh: line 13: return: can only `return' from a function or sourced script"
fi
echo "don't wanna reach here" …Run Code Online (Sandbox Code Playgroud) 我正在写一个相当简单的bash脚本; 如果我检测到错误(没有来自其他进程的错误退出状态)我想退出,退出状态表示错误(没有太具体).
看起来我应该这样做exit 1(例如根据TLDP Advanced Bash Scripting Guide和C Standard Library的stdlib.h标题); 但我注意到很多人exit -1.这是为什么?