Консалтинг C ++ 03, 22.2.2.1.2 / 11, форматы наследуются от scanf
и друзей, которые, в свою очередь, все говорят, что преобразованная последовательность символов «необязательно подписана», даже для тех, у которых нет знака вывод. strtoul
то же самое.
Итак, предположим, вы могли бы сказать, что стандарт, который задает поведение, является C89 для C ++ 03, C99 для C ++ 11.
Поскольку -
оказывается допустимым только как первый символ, я предполагаю, что обходной путь - проверить его с помощью peek
перед использованием operator>>
.
Вам нужно запустить команду в другой группе процессов, и самый простой способ сделать это - использовать управление заданиями:
#!/bin/bash
# Enable job control
set -m
while :
do
read -t 10 -p "input> " input
[[ $input == finish ]] && break
# set SIGINT to default action
trap - SIGINT
# Run the command in background
bash -c "$input" &
# Set our signal mask to ignore SIGINT
trap "" SIGINT
# Move the command back-into foreground
fg %-
done
Попробуйте использовать следующий код:
#!/bin/bash
# type "finish" to exit
# function called by trap
other_commands() {
printf "\rSIGINT caught "
sleep 1
printf "\rType a command >>> "
}
trap 'other_commands' SIGINT
input="$@"
while true; do
printf "\rType a command >>> "
read input
[[ $input == finish ]] && break
bash -c "$input"
done