Załóżmy, że mam plik o confirmation.sh
następującej treści:
#!/bin/bash
echo -n "Are you sure [Y/n]? "
read line
case "$line" in
n|N) echo "smth"
;;
y|Y) echo "smth"
;;
esac
i chcę uruchomić ten skrypt w następujący sposób:
cat confirmation.sh | sh
Rozumiem, Are you sure [Y/n]?
a skrypt został przerwany. Jaki jest problem?
shell-script
shell
pipe
user-input
Igor Tymoszenko
źródło
źródło
/bin/bash
linię podziału, ale używasz.sh
rozszerzenia i próbujesz przesłać skrypt do niegosh
. Nie stanowi to problemu, ponieważ kod, który posiadasz, jest zgodny z oboma, ale warto zwrócić uwagę.Odpowiedzi:
Jak mówili inni, to dlatego, że
stdin
odsh
zostało przekierowane do zapoznania się z rury, to nie jest podłączony do terminala jak to zwykle. Aby obejść ten problem, należy/dev/tty
zmusić skrypt do odczytu z terminala. Na przykład:Zwykle robiłbyś to tylko wtedy, gdy chcesz uniemożliwić innym osobom pisanie skryptów, np .:
Nadal będzie czytać z terminala, nawet jeśli użytkownik może oczekiwać, że zostanie to automatycznie wprowadzone
Y
po znaku zachęty. Jest to powszechne w programach, które oczekują hasła.źródło
Uwaga: dzięki @Graeme za poprawienie mnie w powyższych dwóch przykładach ...
O wiele łatwiej to zrobić, jeśli będziesz trzymać się z
stdin
daleka.Lub, ponieważ wszystkie 0 1 2 terminala są tym samym plikiem, po prostu dodaj:
I twój
Działa dobrze.
źródło
stderr
. Prawdopodobnie powinienem, ale nie rozumiem dlaczego.Działa to w przypadku pojedynczego argumentu przesyłanego do mojego skryptu:
Następnie mogę uzyskać dostęp do danych potokowych za pomocą argumentu pozycyjnego (
$1
), który jest zgodny z moimi innymi działaniami skryptowymi.Od
info test
:źródło
Krótka odpowiedź brzmi: nie możesz. Potok przekierowuje stdout na stdin, dlatego nie można uruchomić skryptu interaktywnego, ponieważ przekierowano już dane wyjściowe z pierwszego polecenia jako dane wejściowe do drugiego polecenia w instrukcji potoku.
Być może chcesz zrobić coś takiego:
źródło
sh confirmation.sh
?