Bagaimana saya bisa tahu (dalam ~/.bashrc
) jika saya menjalankan dalam mode interaktif, atau, katakanlah, mengeksekusi perintah melalui ssh. Saya ingin menghindari pencetakan urutan pelarian ANSI .bashrc
jika itu yang terakhir.
Bagaimana saya bisa tahu (dalam ~/.bashrc
) jika saya menjalankan dalam mode interaktif, atau, katakanlah, mengeksekusi perintah melalui ssh. Saya ingin menghindari pencetakan urutan pelarian ANSI .bashrc
jika itu yang terakhir.
Jawaban:
Menurut man bash
:
PS1 diatur dan $ - termasuk saya jika bash bersifat interaktif, memungkinkan skrip shell atau file startup untuk menguji keadaan ini.
Jadi Anda bisa menggunakan:
if [[ $- == *i* ]]
then
do_interactive_stuff
fi
Juga:
Ketika shell interaktif yang bukan shell login dimulai, bash membaca dan mengeksekusi perintah dari /etc/bash.bashrc dan ~ / .bashrc, jika file-file ini ada.
Jadi ~/.bashrc
hanya bersumber untuk kerang interaktif. Terkadang, orang sumbernya dari ~/.bash_profile
atau ~/.profile
yang tidak benar karena mengganggu perilaku yang diharapkan. Jika Anda ingin menyederhanakan pemeliharaan kode yang umum, Anda harus menggunakan file terpisah untuk berisi kode umum dan sumbernya secara independen dari kedua file rc.
Lebih baik jika tidak ada output untuk stdout dari rc
file login seperti ~/.bash_profile
atau ~/.profile
karena dapat mengganggu operasi yang tepat rsync
misalnya.
Bagaimanapun, itu masih ide yang baik untuk menguji interaktivitas karena konfigurasi yang salah mungkin ada.
[[ $- =~ i ]] && echo interactive
i
~/.bash_profile
atau ~/.profile
yang tidak benar karena itu mengganggu perilaku yang diharapkan . Apa yang Anda pikirkan sumber ~/.bashrc
dari ~/.bash_login
? Karena shell login tidak perlu bersifat interaktif, saya kira itu juga tidak benar.
Menggunakan:
if tty -s; then echo interactive; fi
yang test
alat dapat memeriksa ini (dari halaman manual):
-t FD True if FD is opened on a terminal.
Jadi bisa Anda gunakan misalnya:
if [ -t 0 ] ; then
echo stdin is a terminal
.....
fi
atau
if [ -t 1 ] ; then
echo stdout is a terminal
fi
bash <<< 'test -t 0 && echo Y || echo X'
menulis Y
, bash -c 'test -t 0 && echo Y || echo X'
menulisX
Saya biasanya melihat output dari tty program.
Jika Anda berada di tty, itu akan memberi tahu Anda tty mana Anda berada. Jika Anda tidak dalam mode interaktif, biasanya akan memberi tahu Anda sesuatu seperti "bukan tty".