Saya lebih suka meluncurkan aplikasi GUI dari jendela terminal daripada dengan menggunakan desktop grafis. Yang sering membuat jengkel adalah sering pengembang tidak mengantisipasi jenis penggunaan ini, sehingga aplikasi mencetak banyak pesan yang tidak berguna, samar, atau tidak informatif ke stdout atau stderr. Kekacauan lebih lanjut pada terminal terjadi karena menjalankan program di latar belakang, dengan &, menghasilkan laporan penciptaan dan penghentian pekerjaan.
Apa solusi untuk masalah ini yang akan menerima argumen baris perintah dan menangani pelengkapan otomatis?
Terkait: /programming/7131670/make-bash-alias-that-takes-parameter
sumber
$DISPLAY
tidak diatur (misalnya jika pengguna lupa-X
untuk ssh) atau masalah otorisasi X seperti di sini: unix.stackexchange.com/questions/108679/…"$@" 2>&1 | { quit=$(($(date +%s)+5)); while read line && [ $(date +%s) -lt $quit ]; do printf "[%s] %s\n" "$(date +%T)" "$line"; done; } | head -n 10 &
(poin yang paling penting adalah idenya, bukan implementasi yang sebenarnya).Jawaban ini untuk bash. Sebagai contoh, inilah yang saya lakukan di .bashrc saya untuk membuat perintah kenyamanan
ev
untuk memulai penampil PDF Evince.Baris pertama mendefinisikan suatu fungsi
ev
. Nama fungsi akan dikenali saat Anda menggunakannya di baris perintah seperti ini:(Ini adalah mekanisme yang berbeda dari alias, dan memiliki prioritas lebih rendah.) Output Evince ke stdin dan stdout dikirim ke bitbucket (/ dev / null). Ampersand menempatkan pekerjaan di latar belakang. Mengurung perintah dalam tanda kurung menyebabkannya dijalankan dalam subkulit sehingga tidak mencetak pesan tentang penciptaan pekerjaan latar belakang atau penyelesaiannya.
Baris kedua dari .bashrc saya menggunakan fungsi lengkap bash untuk memberi tahu bash bahwa argumen dari perintah ev diharapkan menjadi file dengan ekstensi pdf. Ini berarti bahwa jika saya juga memiliki file foo.tex, foo.aux, dll., Duduk di direktori saya, saya dapat mengetik
ev foo
dan menekan tombol tab, dan bash akan tahu untuk melengkapi nama file sebagai foo.pdf.sumber
ev() (evince "$@" >&2 &) 2>/dev/null
ev() (evince "$@" &>/dev/null $)
&
.Kemungkinan lain adalah menggunakan
command
untuk menurunkanexec
dari builtin khusus ke builtin lama polos seperti:Jadi sekarang Anda bisa melakukannya:
Saya baru saja memperhatikan bahwa
command
tidak berfungsizsh
(seperti yang terlihat di kebanyakan shell lain) , tetapi jika tidak berhasil, Anda dapat melakukannya:... yang seharusnya bekerja di mana-mana.
Bahkan, Anda mungkin melakukannya:
Jadi Anda bisa melakukan:
KELUARAN
Menindaklanjuti diskusi komentar dengan @ vinc17, perlu dicatat bahwa hampir semua output konsol aplikasi GUI umumnya ditujukan untuk
X
tty - konsolnya. Ketika Anda menjalankanX
aplikasi dari suatuX
.desktop
file, output yang dihasilkannya dialihkan keX
terminal virtual - yang merupakan tty dari mana Anda meluncurkannya.X
. Saya dapat membahas nomor tty ini dengan$XDG_VTNR
.Anehnya - dan mungkin karena saya baru saja mulai menggunakan
startx
- saya tidak lagi bisa menulis/dev/tty$XDG_VTNR
. Ini mungkin juga (karena saya pikir lebih mungkin) ada hubungannya dengan perubahan yang sangat baru dan drastis diimplementasikan denganXorg
v1.16 yang memungkinkannya berjalan di bawahsystemd
sesi pengguna daripada membutuhkan hak akses root .Meski begitu, saya bisa melakukan:
Sekarang semua
some x app
's konsol keluaran sedang diarahkan ke/dev/tty$((1+$XDG_VTNR))
daripada sayaxterm
' s pty. Saya bisa mendapatkan halaman terakhir ini kapan saja seperti:Ini mungkin praktik terbaik untuk mendedikasikan beberapa terminal virtual untuk mencatat keluaran.
/dev/console
umumnya sudah dicadangkan untuk ini, meskipun Anda mungkin lebih suka untuk tidak melakukan halchown
yang mungkin diperlukan bagi Anda untuk menulis itu. Anda mungkin memiliki beberapa fungsi yang memungkinkan Anda melakukan aprintk
- yang pada dasarnya mencetak/dev/console
- dan bisa menggunakannya dengan cara yang saya kira.Cara lain untuk melakukan hal ini akan mendedikasikan pty untuk tujuan tersebut. Anda dapat, misalnya,
xterm
membuka jendela, menyimpan outputtty
ketika dijalankan dari sana dalam variabel lingkungan, dan menggunakan nilai itu sebagai tujuan untukgui
output. Dengan cara itu semua log akan dialihkan ke jendela log yang terpisah, yang kemudian bisa Anda gulir jika Anda suka.Saya pernah menulis jawaban tentang bagaimana hal serupa dapat dilakukan dengan
bash
sejarah, jika Anda tertarik.sumber
echo $?
karena menambahkan informasi yang tidak berguna dan didasarkan pada bug di bash, yang baru saja saya laporkan di sini: lists.gnu.org/archive/html/bug-bash/2014- 08 / msg00081.html dan di BTS Debian: bugs.debian.org/cgi-bin/bugreport.cgi?bug=758969