有什么方法可以覆盖bash陷阱处理程序,这些陷阱处理程序不会永久地删除可能已经设置或可能尚未设置的现有处理程序?如何动态管理陷阱例程的任意链?
有没有办法保存陷阱处理程序的当前状态,以便以后可以恢复?
我偶然发现了一个令人困惑的情况,我发现了一个明显缩小的转换,但我很失望编译器(gcc-4.7.2)没有发出警告,尽管有-Wall -Wnarrowing -pedantic标志.请参阅以下程序:
struct A {
int m;
A( int m ) : m(m) {};
};
int main() {
unsigned long v = 0;
A a1(v); // narrowing, but no warning (should this not cause a warning?)
A a2{v}; // narrowing, warning raised (expected)
}
Run Code Online (Sandbox Code Playgroud)
初始化a1似乎没有从编译器窥视那么多.为了确保我不会疯狂,我尝试以a1相同的方式初始化,但用括号而不是parens.正如预期的那样,编译器在第二种情况下警告缩小范围.
要明确:我不是在询问缩小初始化列表中转换的合法性.我知道这不合法 - 卷曲支撑的初始化a2只是一种健全性检查. 我的问题与初始化列表无关.这不是一个重复的问题.
编译器是否应该警告我缩小初始化范围a1?
我编写了一个 bash 脚本,它将命令作为第一个位置参数,并使用 case 构造作为类似于以下内容的调度:
do_command() {
# responds to invocation `$0 command ...`
}
do_copy() {
# respond to invocation: `$0 copy...`
}
do_imperative() {
# respond to invocation: `$0 imperative ...`
}
cmd=$1
shift
case $cmd in
command)
do_command $*
;;
copy)
do_copy $*
;;
imperative)
do_imperative $*
;;
*)
echo "Usage: $0 [ command | copy | imperative ]" >&2
;;
esac
Run Code Online (Sandbox Code Playgroud)
该脚本根据调用决定哪个函数$1,然后将剩余的参数传递给该函数。我想在不同的部分匹配上添加能力调度,但我想以一种优雅的方式做到这一点(优雅的定义是一种既易于阅读又不会冗长到碍眼或分散注意力的方式)。
明显有效(但不优雅)的解决方案可能是这样的:
case $cmd in
command|comman|comma|comm|com)
do_command $*
;;
copy|cop)
do_copy $*
;; …Run Code Online (Sandbox Code Playgroud)