如何在shell脚本中使用Ctrl-D

12

我有一个bash shell脚本,需要使用ctrl-D来退出终端,请问如何在脚本中使用它?

示例

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

我有不同的主机,输出会被追加到一个最终结果中,当我执行这个特定的shell脚本以及其他一系列命令时,我使用ctrl-D来查看输出。

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

./myscript.sh

按下ctrl-D键

与主机的连接关闭

输出会被显示出来

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

6个回答

9
您可以尝试使用exec <&-
&-用于关闭文件描述符(PS:在Linux中,所有内容都是某种类型的文件...)
<&-正在关闭文件描述符0 = stdin - 也可以写成0<&-

如果您在Linux机器上打开普通终端并键入exec <&-,则会看到您的终端关闭/消失,就像按下^D.一样。

PS1:类似地,exec >&-关闭stdout

PS2:如果您使用exec <&-关闭stdin,则可以通过类似exec </dev/tty的方式重新打开以继续运行脚本。


6

无法直接完成此操作。使用heredoc代替stdin输入。

./someprog.sh << EOF
something here
EOF

@Abrams谢谢,但我尝试执行上面的命令,结果出现了这个?EOF伪终端将不会分配,因为标准输入不是终端。>你能告诉我发生了什么吗?谢谢。 - Shruti

3

为了在脚本中检测Ctrl-D并执行自定义逻辑,您可以逐个字符读取输入,并检查字符键代码是否对应于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

3
请使用以下内容
read  Input
#When ^D is used, read ends up with the exit code "1"
if [[ $? == 1 ]]
then 
     echo "[Ctrl+D] is captured"
fi

0
#! /bin/sh
echo 'Enter one line at a time'
echo 'Press CTRL+D to finish'
cat >test.out
echo 'OK'

这个可以工作是因为cat是一个独立的进程,CTRL-D会命中它而不是你的脚本,杀死它并返回控制。 - spraff

0

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

ssh hostname "last -10"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接