Вы можете игнорировать сигналы (SIG_IGN
), если вы напишете код (, как в https://stackoverflow.com/questions/3232613/how-to-stop-sigint-being-passed-to-subprocess-in-python), или используете trap
в оболочке, как в Как мы можем настроить сигнальную ловушку для SIG _IGN и SIG _DFL в bash? , я думаю, что в perl это библиотека perlipc
https://metacpan.org/pod/perlipc, IPC — это Inter Process Communication
You may also choose to assign the strings 'IGNORE' or 'DEFAULT' as the handler, in which case Perl will try to discard the signal or do the default thing.
источник:https://www.mkssoftware.com/docs/man5/perlipc.5.asp
Вам понадобится какой-то синтаксис разделения, иначе как он узнает, где заканчивается одна read
команда и начинается следующая?
Использование &&
приведет к выполнению второго read
только в том случае, если первый не вернул никаких ошибок. Если вы хотите, чтобы второй всегда выполнялся, вы можете использовать ;
следующим образом:
read -s x ; read -s y
Но мне непонятно, если вы хотите выполнить один read
и сохранить его в переменной x
, затем выполнить второй read
и сохранить его вy
или , если вы хотите выполнить один read
и сохранить один и тот же результат как в x
, так и в y
. Мое предложение делает первое.
По умолчанию для терминала не имеет значения, был ли символ <newline>
частью вставленного текста или введен пользователем. При вставке
read -s x
read -s y
<newline>
после read -s x
заставляет ваш терминал отправить эту строку в вашу оболочку. Оболочка анализирует его, находит, что это завершенная команда, поэтому выполняет ее :read
, затем ожидает содержимого на стандартном вводе, и терминал передает его со строкой read -s y
, которая в конечном итоге устанавливается как значение x
.
Это примерно работает так, как если бы вы набрали read -s x
, нажали Enter , набрали read -s y
, снова нажали Enter .
Нужен ли дополнительный Enter с вашей стороны, каким именно становится значение x
, что на самом деле распечатывается и что произойдет с последующими строками, зависит от вашей оболочки и режима, который она устанавливает терминал к. Например, используя Bash 5.0 и предполагая, что обе строки в буфере обмена заканчиваются <newline>
,
# Pasting with Ctrl + Shift + v, Enter
$ read -s x
$ # The prompt comes back after pressing Enter again
$ declare -p x y
"eclare -- x="read -s y
bash: declare: y: not found
Вывод(declare
выглядит искаженным, потому что Bash настраивает терминал так, чтобы он не преобразовывал\r
(возврат каретки )в\n
(перевод строки ), когда активно редактирование строки (по умолчанию ); когда первый read
инструктирует терминал включить преобразование \r
→ \n
, терминал уже ввел\r
(символ, который он отправляет при нажатии Enter или перевод строки вставляется )после второй вставленной строки в буфер, в результате чего read
добавляется буквально к значению x
и требует от вас нажатия Enter , чтобы сигнализировать об окончании ввод ).
Этого не произойдет, если вы вставите
read -s x &&
read -s y
, потому что оболочка анализирует read -s x &&
как неполный список «И» и ожидает ввода дополнительных данных, пока не сможет выполнить полную команду.
Способ, которым вы можете вставить несколько команд одновременно, заключается в использовании "вставки в квадратных скобках", терминального режима, в котором вставленный текст вставляется в буфер как одна строка, а не обрабатывается так, как если бы он был были набраны вручную.
Bash поддерживает его начиная с версии 4.4. Вы можете включить его, добавив
set enable-bracketed-paste on
в файл инициализации Readline (по умолчанию,~/.inputrc
).
Zsh поддерживает его , начиная с версии 5.1, и он включен по умолчанию, когда ZLE (Zsh Line Editor )активен.
Подробнее о том, как это работает и как включить, см.: