不确定我是否应该将它放在stackoverflow或unix.stackexchange上,但我在这里发现了一些类似的 问题,所以这里就是这样.
我正在尝试创建一个由.bashrc调用的脚本,它允许我根据单个击键选择两个选项中的一个.这通常不会很难但我希望对应于这两个选项的两个键是空格并输入.
这是我到目前为止所得到的:
#!/bin/bash
SELECT=""
while [[ "$SELECT" != $'\x0a' && "$SELECT" != $'\x20' ]]; do
echo "Select session type:"
echo "Press <Enter> to do foo"
echo "Press <Space> to do bar"
read -s -N 1 SELECT
echo "Debug/$SELECT/${#SELECT}"
[[ "$SELECT" == $'\x0a' ]] && echo "enter" # do foo
[[ "$SELECT" == $'\x20' ]] && echo "space" # do bar
done
Run Code Online (Sandbox Code Playgroud)
如果我按下enter,space,backspace和x,我得到的是以下输出:
:~$ bin/sessionSelect.sh
Select session type:
Press <Enter> to start/resume a screen session
Press <Space> …Run Code Online (Sandbox Code Playgroud) 我目前正在研究一些应该使用set -e和确认Linux Standard Base核心规范的init脚本.现在这两个人并没有真正合作:
由于set -e第一个失败的命令导致脚本以失败命令的返回值退出,因此我无法将脚本的退出状态设置为符合LSB符合LSB不兼容返回值失败的命令.我可以unset -e在每个这样的命令之前,但那是非常麻烦的,在那种情况下,我实际上根本不使用它set -e?
我想另一种方式来达到同样的效果与unset -e将做类似
returns_1() { return 1; }
...
cmd_that_fails_with_non_LSB_return_values || returns_1
Run Code Online (Sandbox Code Playgroud)
但这似乎也很笨重,我再次必须检查每个命令的可能返回值.
是否有一种方法可以设置脚本在终止时由于set -e固定值而返回的错误代码,因此它将返回1(即LSB一般/未指定的错误),而不是失败命令的返回值是什么?我不应该打扰LSB符合返回码和/或设置-e吗?(这可能会变成一个讨论,set -e无论如何从你获得的搜索结果的数量来判断)
小代码片段来说明问题:
#!/bin/bash
# init script for service foo
set -e
start() {
echo "bar"
cmd_fails_with_return_code_3 # script exits with return code 3, not LSB conformant
echo "baz"
}
...
case "$1" in
start)
start
;;
...
esac
Run Code Online (Sandbox Code Playgroud) 我有几个void函数(让我们称之为foo和bar)共享相同的void函数清理,如果它们陷入困境,它们会在它们之后清理:
#include <iostream>
void cleanup() { std::cout << "doing cleanup" << std::endl; }
void foo(int & i) {
if(i == 0) { return cleanup(); }
--i;
if(i == 0) { return cleanup(); }
++i;
}
void bar(int & i) {
if(i == 0) { return cleanup(); }
++i;
if(i == 0) { return cleanup(); }
--i;
}
int main() {
int i = 0;
foo(i);
bar(i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
cpp.sh愉快地编译并运行代码.
感谢这个问题的答案,我知道我可以返回一个void类型的对象.但我不知道它是否适用于返回void返回值.
你怎么看,代码是否符合标准?
你宁愿返回虚拟整数来使代码更具可读性吗?或者无用的返回值会使代码难以阅读吗?
编辑:我觉得我需要补充一些澄清,例如'cleanup(); 返回;' 不是解决方案.实际代码比示例更复杂,并且取决于我离开函数的位置,在cleanup()调用之后会发生其他一些事情.'return cleanup();' …