Saya rasa saya mengerti perbedaan antara interaktif, login dan shell batch. Lihat tautan berikut untuk bantuan lebih lanjut:
- Apa perbedaan antara 'Login' dan 'bash shell' (dari situs saudara: serverfault.com )
- 2.1: Jenis shell: shell interaktif dan login (dari Panduan Pengguna ke Z-Shell )
Pertanyaan saya adalah, bagaimana saya bisa menguji dengan perintah / kondisi jika saya sedang interaktif, login atau shell batch?
Saya mencari perintah atau ketentuan (yang mengembalikan true
atau false
) dan bahwa saya juga bisa menempatkan pada pernyataan if. Sebagai contoh:
if [[ condition ]]
echo "This is a login shell"
fi
Jawaban:
Saya mengasumsikan
bash
shell, atau serupa, karena tidak ada shell yang tercantum dalam tag.Untuk memeriksa apakah Anda berada di shell interaktif:
Untuk memeriksa apakah Anda berada di shell login:
Dengan "batch", saya anggap Anda maksud "tidak interaktif", jadi cek untuk shell interaktif sudah cukup.
sumber
zsh
pengguna, memeriksa shell login dapat dilakukan dengan:if [[ -o login ]] ...
$-
sedang diperluas di shell saat ini. Jika Anda menggunakan tanda kutip tunggal di sekitar ekspresi penuh, Anda akan mendapatkan hasil yang benar:bash -c '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"'
Dalam shell Bourne-style,
i
opsi menunjukkan apakah shell itu interaktif:Tidak ada cara portabel dan sepenuhnya dapat diandalkan untuk menguji shell login. Ksh dan zsh menambahkan
l
untuk$-
. Bash menetapkanlogin_shell
opsi, yang bisa Anda queryshopt -q login_shell
. Mudah-mudahan, tes apakah$0
dimulai dengan-
: shell biasanya tahu itu shell login karena pemanggil menambahkan-
awalan ke argumen nol (biasanya nama atau jalur yang dapat dieksekusi). Ini gagal mendeteksi cara-cara khusus shell dalam menjalankan shell login (misash -l
.).sumber
$0
selalu dimulai dengan-
tidak peduli bagaimana itu dimulai. Tapi setidaknya ada satu pengecualian: Ini tidak selalu benar dengan bash bahkan jika itu seharusnya merupakan shell login. Cobalah di kotak Anda: aktifkanbash --login
, lalu$0
masih bacabash
.kulit ikan
Inilah jawaban untuk
fish
seandainya ada pengguna lain yang menemukan halaman ini.Dokumentasi ikan: inisialisasi
sumber
csh / tcsh
Untuk
csh
dantcsh
saya memiliki yang berikut dalam.cshrc
file saya :Khusus untuk
tcsh
, variabelloginsh
ditetapkan untuk shell login:(
tcsh
juga memiliki variabelshlvl
yang diatur ke jumlah shell yang bersarang, di mana shell login memiliki nilai 1.)sumber
PS1
tidak berfungsi untuk menguji shell interaktif. Ini hampir selalu diatur dalam interaktif, tetapi Anda dapat menghapusnya. Ini sangat sering diatur dalam shell noninteractive, karena banyak sistem kapal denganexport PS
di/etc/profile
.Cara lain adalah dengan memeriksa hasilnya
tty
sumber
[ -t 0 ]
untuk menguji apakah STDIN adalah tty. Anda juga dapat menggunakan 1 (STDOUT) atau 2 (STDERR) tergantung kebutuhan Anda.disown
dan hidup,tty
bekerja lebih baik untuk mengetahui bahwa itu tidak interaktif lagi, sementara$-
tidak berubah; Saya masih bingung tentang apa pendekatan terbaik.[ -t 0 ]
. PS Dalam komentar saya sebelumnya, saya menulis bahwa "ada korelasi yang kuat" - Saya lupa "selain dari kasus skrip yang sangat umum dimulai dengan#!/bin/sh
atau sejenisnya", yang non-interaktif tetapi dapat dihubungkan ke terminal.UNIX / Linux memiliki perintah untuk memeriksa apakah Anda berada di terminal.
sumber
dash
juga berfungsi .Anda dapat memeriksa untuk melihat apakah stdin adalah terminal:
sumber
Untuk memeriksa apakah skrip berjalan dalam shell interaktif atau non-interaktif, saya memeriksa skrip saya untuk mengetahui prompt yang disimpan dalam
$PS1
variabel:Ini saya pelajari di sini: https://www.tldp.org/LDP/abs/html/intandnonint.html
sumber
i
bukan pilihan yang tepat untuk dicari.-i
adalah untuk memaksa shell yang tidak interaktif untuk menjadi interaktif. Opsi yang diaktifkan secara otomatis adalah-s
, tetapi sayangnya Bash tidak menangani ini dengan benar.Anda perlu memeriksa apakah
$-
mengandungs
(ini diberikan untuk diaktifkan secara otomatis) atau apakah mengandungi
(ini tidak diberikan untuk diaktifkan secara otomatis tetapi secara resmi hanya digabungkan ke-i
opsi baris perintah shell).sumber
s
akan terjadi jika shell membaca perintah dari stdin, bukan apakah itu interaktif. Shell interaktif tidak harus membaca perintah dari stdin (cobazsh -i < /dev/null
, meskipun zsh tampaknya menjadi pengecualian di sini). Dan shell mungkin membaca perintah dari stdin dan tidak bersifat interaktif (sukash < file
atauecho 'echo "$1"' | sh -s foo bar
).[[...]]
yang menyiratkan ksh / bash / zsh. Anda mendapat poin sebagai catatan sejarah bahwa memeriksai
masuk$-
tidak akan berfungsi di shell Bourne. Tapi kemudian memeriksas
tidak akan bekerja dengan baik di sana. Anda juga ingin memeriksa[ -t 0 ]
ataui
; bahkan itu akan tertipu dalam kasus sudut sepertiecho 'exec < /dev/tty; that-check' | sh'