Processo de substituição <(…)
cria um canal, usa /dev/fd
para dar um caminho que é equivalente ao descritor de arquivo onde o pipe é e passa o nome do arquivo como um argumento para o programa. Aqui o programa é sudo
, e ele passa esse argumento (que é apenas uma string, no que diz respeito a ele) para wpa_supplicant
, que o trata como um nome de arquivo.
O problema é que o sudo fecha todos os descritores de arquivos, exceto os padrões (stdin = 0, stdout = 1 e stderr = 2). O pipe da substituição do processo está em outro descritor, que é fechado, então quando wpa_supplicant
tenta abri-lo, ele encontra um arquivo que não existe.
Se sua política sudo permitir (a opção closefrom_override
está habilitada), você pode dizer para não fechar os descritores de arquivos. Mas isso geralmente não é o caso.
sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)
Como alternativa, como você não está usando a entrada padrão, passe os dados para lá.
wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin
Como alternativa, execute um shell do sudo e coloque a substituição do processo lá. Tome cuidado com as citações se o comando contiver caracteres especiais.
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'