Почему две или более команд чтения не могут быть выполнены за один раз (без некоторого синтаксиса разделения )?

Вы можете игнорировать сигналы (SIG_IGN), если вы напишете код (, как в https://stackoverflow.com/questions/3232613/how-to-stop-sigint-being-passed-to-subprocess-in-python), или используете trapв оболочке, как в Как мы можем настроить сигнальную ловушку для SIG _IGN и SIG _DFL в bash? , я думаю, что в perl это библиотека perlipchttps://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

0
27.08.2020, 19:44
2 ответа

Вам понадобится какой-то синтаксис разделения, иначе как он узнает, где заканчивается одна readкоманда и начинается следующая?

Использование &&приведет к выполнению второго readтолько в том случае, если первый не вернул никаких ошибок. Если вы хотите, чтобы второй всегда выполнялся, вы можете использовать ;следующим образом:

read -s x ; read -s y

Но мне непонятно, если вы хотите выполнить один readи сохранить его в переменной x, затем выполнить второй readи сохранить его вyили , если вы хотите выполнить один readи сохранить один и тот же результат как в x, так и в y. Мое предложение делает первое.

1
18.03.2021, 23:09

По умолчанию для терминала не имеет значения, был ли символ <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 )активен.

Подробнее о том, как это работает и как включить, см.:

5
18.03.2021, 23:09

Теги

Похожие вопросы