Saya memiliki skrip Bash yang saya coba buat untuk membantu saya menjalankan perintah yang agak rumit dengan perubahan kecil yang akan ditanyakan kepada saya melalui gema dan membaca.
Saya telah menemukan solusi untuk memaksanya menjalankan terminal untuk menjalankan perintah, tetapi saya tidak tertarik dengan itu. Yang ingin saya lakukan adalah, jika saya keluar dan tekan Enter saja di Nautilus (membuatnya dijalankan dengan Run Software), itu hanya akan dengan lembut mengeluarkan pemberitahuan yang mengatakan "Silakan jalankan ini dari terminal."
Saya bisa membuat popup terjadi - seperti pada saya tahu perintah - tetapi saya tidak bisa mendapatkan skrip Bash untuk mengetahui apakah itu dijalankan di dalam terminal atau tidak, sepertinya selalu berpikir seperti itu. Apakah itu mungkin?
||
dalam[ … ]
seperti itu? Jika Anda menggunakan[[ … ]]
maka itu akan baik-baik saja, tetapi biasanya||
digunakan untuk memisahkan perintah, dan[ -t 0
merupakan doa yang salah[
karena yang terakhir]
tidak ada. Biasanya tidak ada perintah-p
juga. Saya setuju dengan pengujian untuk terminal; itu mungkin cara untuk melakukannya. Itu hanya sintaks yang saya khawatirkan.||
terlihat sebelum]
argumen final yang diperlukan untuk[
.PS1
bukan tes yang dapat diandalkan untuk mengetahui apakah shell itu interaktif. “Jika skrip perlu menguji apakah skrip berjalan dalam shell interaktif” juga membingungkan: seharusnya jika beberapa kode perlu diuji - skrip biasanya tidak berjalan dalam shell interaktif (tetapi bisa juga, jika bersumber) . Mengujii
dalam$-
adalah cara yang benar untuk menguji apakah shell itu interaktif. Menguji-t 0
atau-t 2
cara yang benar untuk mengetahui apakah skrip berjalan di terminal, yang berbeda dari yang interaktif.Gunakan variabel bash $ SHLVL untuk mendeteksi tingkat penumpukan shell. Dalam skrip yang dijalankan 'mentah' dengan mengklik ganda itu akan menjadi 1, dalam skrip yang berjalan dalam terminal itu akan 2.
sumber
Meskipun jawaban goldilocks mungkin benar dalam kasus tipikal, tampaknya memang ada kasus tepi. Dalam kasus saya sendiri, xserver saya dikonfigurasi untuk memulai dari
tty1
dan tidak pernah meninggalkan tty itu. Jika Xorgstdout
adalah TTY maka tampaknya klien akan memiliki TTY yang ditautkan ke deskriptor file mereka secara default.Inilah cara saya memecahkan masalah saya:
Saya belum menguji ini untuk melihat apakah itu bekerja pada konfigurasi X yang lebih standar, dan saya juga sangat meragukan bahwa ini adalah satu-satunya kasus tepi. Jika ada yang menemukan solusi yang lebih umum berlaku, silakan kembali dan beri tahu kami.
sumber
Lain, menggunakan opsi bash mengatur variabel internal
$-
,.Dari
.bashrc
,sumber
cmd | sh -i | cmd
.