小编a.p*_*anz的帖子

bash脚本 - 读取单击键,包括特殊键输入和空格

不确定我是否应该将它放在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)

linux bash shell keystroke special-characters

8
推荐指数
2
解决办法
6861
查看次数

在以set -e开头的bash脚本中,我可以将退出代码设置为与第一个失败命令不同的值吗?

我目前正在研究一些应该使用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)

linux bash init.d

2
推荐指数
1
解决办法
1830
查看次数

C++:从void函数返回void函数的返回值

我有几个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();' …

c++ coding-style standards-compliance

1
推荐指数
2
解决办法
1386
查看次数