Mari kita asumsikan saya memiliki file bernama confirmation.sh
dengan konten berikut:
#!/bin/bash
echo -n "Are you sure [Y/n]? "
read line
case "$line" in
n|N) echo "smth"
;;
y|Y) echo "smth"
;;
esac
dan saya ingin menjalankan skrip ini dengan cara berikut:
cat confirmation.sh | sh
Saya melihat Are you sure [Y/n]?
dan skripnya terputus. Apa masalahnya?
shell-script
shell
pipe
user-input
Igor Timoshenko
sumber
sumber
/bin/bash
di garis bang, namun Anda menggunakan.sh
ekstensi dan mencoba untuk menyalurkan scriptsh
. Bukan masalah karena kode yang Anda miliki kompatibel dengan keduanya, tetapi patut ditunjukkan.Jawaban:
Seperti orang lain berkata, ini karena
stdin
darish
telah diarahkan untuk membaca dari pipa, itu tidak terhubung ke terminal karena biasanya akan. Satu hal yang dapat Anda lakukan untuk menyiasatinya adalah menggunakan/dev/tty
untuk memaksa skrip membaca dari terminal. Misalnya:Biasanya Anda hanya akan melakukan ini jika Anda secara khusus ingin mencegah orang lain untuk menuliskan input, misalnya:
Ini masih akan membaca dari terminal meskipun pengguna mungkin berharap ini secara otomatis dimasukkan
Y
pada prompt. Adalah umum untuk program yang mengharapkan kata sandi untuk melakukan ini.sumber
catatan: terima kasih kepada @Graeme untuk mengoreksi saya pada dua contoh di atas ...
Ini jauh lebih mudah dilakukan jika Anda tetap
stdin
jelas.Atau, karena 0 0 2 terminal semua file yang sama, tambahkan saja:
Dan milikmu
Bekerja dengan baik.
sumber
stderr
olah Saya mungkin harus, saya tidak mengerti mengapa.Ini berhasil untuk satu argumen yang disalurkan ke skrip saya:
Saya kemudian dapat mengakses data yang disalurkan dalam argumen posisi (
$1
), yang kompatibel dengan cara kerja skrip saya yang lain.Dari
info test
:sumber
Jawaban singkatnya adalah Anda tidak bisa. Pipa mengarahkan ulang stdout ke stdin, jadi karena itu Anda tidak dapat menjalankan skrip interaktif, karena Anda telah mengarahkan ulang output dari perintah pertama sebagai input ke perintah kedua dalam pernyataan pipa.
Anda mungkin ingin melakukan sesuatu seperti ini:
sumber
sh confirmation.sh
?