代码之家  ›  专栏  ›  技术社区  ›  Vlastimil Burián

如何在Linux posix shell脚本中捕获ctrl+z;是否可能?

  •  0
  • Vlastimil Burián  · 技术社区  · 5 年前

    我是一个Linuxshell脚本编写者,我想知道是否可以 trap 信号用于 脚本睡眠 :

    那就是 Ctrl键 + Z ?

    我现在就这么做了,我也想捕捉到睡眠信号。

    # define functions to handle signals
    # treat them as errors with appropriate messages
    sighup()   {  print_error_and_exit "trap()" "Caught SIGHUP (1). Terminating. Bye!";    }
    sigint()   {  print_error_and_exit "trap()" "Caught SIGINT (2). Terminating. Bye!";    }
    sigquit()  {  print_error_and_exit "trap()" "Caught SIGQUIT (3). Terminating. Bye!";   }
    sigabrt()  {  print_error_and_exit "trap()" "Caught SIGABRT (6). Terminating. Bye!";   }
    sigterm()  {  print_error_and_exit "trap()" "Caught SIGTERM (15). Terminating. Bye!";  }
    
    # use the above functions as signal handlers;
    # note that the SIG* constants are undefined in POSIX,
    # and numbers are to be used for the signals instead
    trap 'sighup' 1; trap 'sigint' 2; trap 'sigquit' 3; trap 'sigabrt' 6; trap 'sigterm' 15
    

    何处 print_error_and_exit 函数的作用正如它的名字所说。


    目标:我想 忽视 如果在终端上键入此信号(显然这很重要)。

    1 回复  |  直到 5 年前
        1
  •  1
  •   jhnc    5 年前

    忽视 Ctrl键 + Z 从终端键入,可以执行以下操作:

    trap '' TSTP
    
    # or possibly equivalently
    trap '' 18
    trap '' 20
    trap '' 24
    

    正如其他人所指出的,还有其他不能被阻塞的信号,例如sigkill和sigstop。

    多壳映射 Ctrl键 + \ 西格基尔和 Ctrl键 + C 对…

    stty -a 应显示发送“susp”(sigtsp)、“intr”(sigint)和“quit”(sigkill)的设置。如果需要,用户可以反弹这些按键。

    编者注 :

    • 不能使用 SIGTSTP posix shell脚本中的假名。

    • 即使你知道确切的信号号码 你的 终端发送,如果编写一个通用脚本,您应该阻止这三种可能性。

    • ShellCheck警告,我引用:

      Trapping signals by number is not well defined. Prefer signal names. [SC2172]
      

      手段 这些 信号数量在不同平台之间可能有所不同,请尝试使用15个sigterm,您将完全看不到任何警告,因为它是POSIX标准化的。因此,您可能希望在测试代码之后禁用这些功能:

      # shellcheck disable=SC2172
      

      链接到维基: https://github.com/koalaman/shellcheck/wiki/SC2172