【问题标题】:how to use ctrl-D in a shell script如何在 shell 脚本中使用 ctrl-D
【发布时间】:2010-10-16 11:28:47
【问题描述】:

我有一个 bash shell 脚本,需要 ctrl-D 才能跳出终端。谁能告诉我如何在 shell 脚本中使用它

示例

ssh host last --->显示登录到该主机的用户列表

我有不同的主机,输出被附加到一个 final 上,当我执行这个特定的 shell 脚本以及其他一系列命令时,我使用 ctrl-D 查看输出

假设我的 shell 脚本是 myscript.sh 执行 myscript.sh

./myscript.sh

ctl-D

与主机的连接已关闭

显示输出

相反,我想在我的脚本文件中使用 ctrl-D

【问题讨论】:

    标签: bash shell unix


    【解决方案1】:

    没有办法直接做到这一点。改为使用heredoc 来提供标准输入。

    ./someprog.sh << EOF
    something here
    EOF
    

    【讨论】:

    • @Abrams 谢谢,但我尝试执行上面的 cmd 我得到了这个? EOF 伪终端不会被分配,因为标准输入不是终端。 > 你能告诉我发生了什么吗?谢谢
    【解决方案2】:

    你可以试试exec &lt;&amp;-
    &amp;- 用于关闭文件描述符(ps:linux 中的一切都是一种文件...)
    &lt;&amp;- 正在关闭文件描述符 0 = stdin - 也可以写成0&lt;&amp;-

    如果你在你的 linux 机器上打开一个普通终端并输入exec &lt;&amp;-,你会看到你的终端关闭/消失,就像你按下^D.一样

    PS1:同样,exec &gt;&amp;- 关闭标准输出

    PS2:如果您使用exec &lt;&amp;- 关闭标准输入,您可以使用exec &lt;/dev/tty 之类的内容重新打开以继续您的脚本

    【讨论】:

      【解决方案3】:

      要检测脚本中的 Ctrl-D 并在其上运行自定义逻辑,您可以逐个字符读取输入字符并检查 char 键代码是否对应于 Ctrl-D。

      这是一个代码示例:

      IFS=
      while true; do
          read -n 1 key
          line=$line$key
          printf -v key_code "%d" "'$key"
          if [ $key_code -eq 4 ]; then
              echo "Ctrl-D pressed!"
          fi
          if [ "$key" = '' ]; then
              echo "Line was $line"
              line=
          fi
      done
      

      【讨论】:

        【解决方案4】:

        使用这个

        read  Input
        #When ^D is used, read ends up with the exit code "1"
        if [[ $? == 1 ]]
        then 
             echo "[Ctrl+D] is captured"
        fi
        

        【讨论】:

          【解决方案5】:
          #! /bin/sh
          echo 'Enter one line at a time'
          echo 'Press CTRL+D to finish'
          cat >test.out
          echo 'OK'
          

          【讨论】:

          • 这是有效的,因为cat 是一个单独的进程,CTRL-D 会命中它而不是你的脚本,杀死它,然后返回控制权。
          【解决方案6】:

          你为什么不告诉last你想看多少行?然后你就不必用 Ctrl+D 来打断它了。例如,要查看 10 行,请使用:

          ssh hostname "last -10"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-02
            • 1970-01-01
            • 2016-02-01
            • 1970-01-01
            • 2016-04-20
            • 2010-09-06
            • 2012-07-09
            相关资源
            最近更新 更多