как использовать Ctrl-D в сценарии оболочки - PullRequest
7 голосов
/ 16 октября 2010

У меня есть сценарий оболочки bash, который требует ctrl-D для выхода из терминала. Кто-нибудь может сказать мне, как использовать его в сценарии оболочки

пример

ssh host last --> отображает список пользователей, которые вошли в систему на этом хосте

У меня есть разные хосты, вывод добавляется к одному финалу, и когда я выполняю этот конкретный сценарий оболочки вместе с другими сериями команд, яЯ использую Ctrl-D, чтобы увидеть вывод

. Предположим, мой сценарий оболочки - myscript.sh для выполнения myscript.sh

. / myscript.sh

ctl-D

соединение с хостом закрыто

выводится вывод

Вместо этого я хочу использовать ctrl-D в моем файле сценария

Ответы [ 6 ]

3 голосов
/ 16 октября 2010

Нет способа сделать это напрямую. Вместо этого используйте heredoc для подачи стандартного ввода.

./someprog.sh << EOF
something here
EOF
2 голосов
/ 13 марта 2017

Вы можете попробовать exec <&-
&- используется для закрытия файлового дескриптора (ps: все в linux является разновидностью файла ...)
<&- закрывает дескриптор файла 0 = stdin - также может быть записан как 0<&-

Если вы откроете обычный терминал на вашем Linux-компьютере и наберете exec <&-, вы увидите, что ваш терминал закрывается / исчезает, как если бы вы нажали ^D.

PS1: аналогичным образом exec >&- закрывает стандартный вывод

PS2: если вы закроете стандартный ввод с помощью exec <&-, вы можете снова открыть его, чтобы продолжить выполнение сценария, например exec </dev/tty

2 голосов
/ 18 февраля 2016

Чтобы обнаружить Ctrl-D в скриптах и ​​запустить собственную логику для него, вы можете прочитать ввод char по символам и проверить, соответствует ли код клавиши 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
0 голосов
/ 12 марта 2017

Используйте это

read  Input
#When ^D is used, read ends up with the exit code "1"
if [[ $? == 1 ]]
then echo 
fi
0 голосов
/ 17 октября 2010

Почему бы вам не сказать last, сколько строк вы хотите увидеть? Тогда вам не придется прерывать его с помощью Ctrl + D. Например, чтобы увидеть 10 строк, используйте:

ssh hostname "last -10"
0 голосов
/ 16 октября 2010
#! /bin/sh
echo 'Enter one line at a time'
echo 'Press CTRL+D to finish'
cat >test.out
echo 'OK'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...