Vamos supor que eu tenha um arquivo nomeado confirmation.sh
com o seguinte conteúdo:
#!/bin/bash
echo -n "Are you sure [Y/n]? "
read line
case "$line" in
n|N) echo "smth"
;;
y|Y) echo "smth"
;;
esac
e quero executar esse script da seguinte maneira:
cat confirmation.sh | sh
Eu vejo Are you sure [Y/n]?
e o script é interrompido. Qual é o problema?
shell-script
shell
pipe
user-input
Igor Timoshenko
fonte
fonte
/bin/bash
na linha de chegada, mas usa uma.sh
extensão e tenta canalizar o script parash
. Não é um problema, pois o código que você possui é compatível com ambos, mas vale a pena destacar.Respostas:
Como já foi dito, isso é porque o
stdin
desh
foi redirecionada para ler a partir do tubo, ele não está conectado ao terminal, uma vez que, normalmente, seria. Uma coisa que você pode fazer para contornar isso é usar/dev/tty
para forçar a leitura do script no terminal. Por exemplo:Normalmente, você só faria isso se quiser especificamente impedir que as pessoas escrevam a entrada de scripts, por exemplo:
Isso ainda será lido no terminal, mesmo que o usuário possa esperar que isso seja inserido automaticamente
Y
no prompt. É comum para programas que esperam que uma senha faça isso.fonte
nota: obrigado a @Graeme por me corrigir nos dois exemplos acima ...
É muito mais fácil fazer isso se você ficar
stdin
longe.Ou, como 0 1 2 do terminal são todos do mesmo arquivo, basta adicionar:
E seu
Funciona muito bem.
fonte
stderr
embora. Eu provavelmente deveria, porém, não entendo o porquê.Isso funcionou para um único argumento sendo canalizado para o meu script:
Posso acessar os dados canalizados em um argumento posicional (
$1
), que é compatível com meus outros trabalhos de script.De
info test
:fonte
A resposta curta é que você não pode. O pipe redireciona stdout para stdin, portanto, você não pode executar um script interativo, pois você já redirecionou a saída do primeiro comando como entrada para o segundo comando na instrução de pipe.
Você pode estar procurando fazer algo assim:
fonte
sh confirmation.sh
?