Вы можете использовать --passphrase-fd 0 чтобы сказать gpg, что нужно читать пароль из stdin. Это должно хорошо ладить с трубами. Не отправляйте это дважды; это требуется только для обнаружения опечаток, когда вы делаете это в интерактивном режиме.
Обычно gpg читает из tty, поэтому вы можете перенаправлять как ввод, так и вывод, и при этом иметь возможность вводить фразу-пароль.
В обычном сеансе входа ваша оболочка подключается к терминалу с помощью трех файловых дескрипторов: stdin, stdout и stderr. Каналы и операторы перенаправления меняются там, где указываются эти файловые дескрипторы.
Если вы запускаете команду без каких-либо операторов перенаправления, все ее файловые дескрипторы наследуются от оболочки. Когда он читает из стандартного ввода, он читает из tty.
Если вы запускаете ту же команду с оператором < перенаправления, его стандартный ввод соединяется с файлом, имя которого появляется после < . Если вы поместите команду на правой стороне | оператор, его стандартный ввод связан с дескриптором файла канала (противоположный конец которого подключен к стандартному выводу команды в левой части | .)
Это то, что вы, наверное, уже знали. Что вы не знали, так это то, что помимо файловых дескрипторов есть еще одна вещь, которая связывает терминалы и процессы: управляющий терминал. У вашего процесса оболочки есть управляющий терминал, и он наследуется всеми дочерними процессами, в том числе и вашим gpg .
Когда программа хочет получить ввод с клавиатуры от пользователя, несмотря на то, что stdin не является терминалом, она может получить доступ к своему управляющему терминалу, открыв специальный файл /dev/tty .
Одним из видов программ, которые сильно зависят от этой функции, является пейджер (например, more , less). Если вы запустите somecommand | less , чего less хочет сделать, так это прочитать некоторые данные из канала на stdin, отобразить первый экран и затем прочитать с клавиатуры, чтобы дождаться, пока вы нажмете клавишу, чтобы сказать, что делать дальше. stdin не может быть одновременно трубой и клавиатурой, поэтому less открывается /dev/tty .
Управляющий терминал для процесса указан в столбце TTY ps .