Saya ingin skrip bash saya (khususnya saya ~/.bashrc
) melakukan sesuatu hanya jika terminal dibuka oleh saya secara langsung, dan melakukan sesuatu yang lain jika dibuka melalui aplikasi misalnya VS Code. Bagaimana saya bisa menentukan apa masalahnya? Apakah ada variabel untuk itu? Terima kasih sebelumnya.
bash
gnome-terminal
bashrc
PaperBag
sumber
sumber
env
perintah. Lihat apakah ada variabel VS-spesifik yang bisa kita gunakan.yakuake
dan memilikiPULSE_PROP_OVERRIDE_application.name=Yakuake
set variabel , danxterm
setXTERM_VERSION=XTerm(322)
pada mesin saya.env >env_term1
dalam satu emulator,env >env_term2
yang kedua dan bagaimana menggunakan apa yangdiff env_term{1,2}
dikatakan sangat berguna. Lagipula, OP mengatakan misalnya VS Code .Jawaban:
Anda mungkin bisa melakukannya dengan berjalan kembali ke leluhur shell dan mencari tahu apakah itu dimulai oleh sesuatu yang setara dengan "Anda", atau program lain.
Dapatkan PID (ID proses) shell, dan dari itu PPID (ID proses induk). Terus naik sampai Anda menemukan sesuatu yang memberi tahu Anda dari mana asalnya. Anda mungkin perlu melakukan percobaan pada sistem Anda - setidaknya, saya tidak tahu apakah itu akan bersifat universal.
Misalnya, di sistem saya, dapatkan PID dari shell dan gunakan
ps
untuk menunjukkan bahwa itubash
:Dapatkan PPID 18852:
Cari tahu apa itu PPID (18842):
Kita dapat melihatnya gnome-terminal, yaitu terminal emulator / terminal windows. Mungkin itu cukup baik untuk Anda, jika shell Anda diluncurkan oleh program lain tidak berjalan di jendela terminal emulator.
Jika tidak cukup baik, naik ke level lain:
Ini memberitahu kita bahwa
gnome-terminal
itu dimulai olehinit
. Saya kira shell Anda yang dijalankan oleh program lain akan memiliki sesuatu yang berbeda di sana.sumber
pstree -s $$
init
proses tidak pid 1 meskipun, tidak yakin apakah itu akan mengubah apa pun.gnome-terminal
. Saya menjalankan perintah saya di bawahif [ $(pstree -s $$ | grep "gnome-terminal" -c) -gt 0 ]; then ...
dan itu berhasil.Sejauh Visual Studio Code berjalan, tampaknya ada cara untuk mengatur variabel lingkungan tambahan untuk terminal terintegrasi . Jadi, atur Visual Studio untuk menggunakan konfigurasi ini:
Dan di dalam
~/.bashrc
:Secara umum, Anda bisa mengandalkan lingkungan yang diberikan untuk
bash
proses tersebut. Misalnya, yang$TERM
variabel , dan menjalankan yang samaif..then...else...fi
cabang untuk[ "$TERM" = "xterm" ]
atau sesuatu yang lain. Atas dasar kasus per kasus, Anda dapat menyelidiki perbedaan di lingkungan melalui menjalankanenv
di setiap konsol, menyimpannya ke file seperti dalamenv > output_console1.txt
, dandiff output_console1.txt output_console2.txt
seperti yang disarankan oleh pencuci mulut di komentar .sumber
$Env:var
bukan sintaks untuk variabel lingkungan di Bash. Ini sepertinya hal yang Powershell bagi saya.$foo
cukup. Kopi mungkin tidak cukup.Jika Anda berbicara tentang satu aplikasi pihak ketiga tertentu, maka gunakan variabel lingkungan. Sebagian besar program akan melewati seluruh lingkungan tidak berubah ketika mereka melakukan proses baru + fork.
Jadi, mulai aplikasi ini dengan custom env var yang dapat Anda periksa . mis. buat alias untuk suka
alias vs=RUNNING_FROM_VSCODE=1 VSCode
, atau buat skrip pembungkus seperti ini:Maka di Anda
.bashrc
, Anda bisa melakukannyaPernyataan aritmatika bash
(( ))
benar jika ekspresi mengevaluasi ke integer non-nol (itulah sebabnya saya gunakan di1
atas). String kosong (untuk unset env var) salah. Ini bagus untuk variabel bash boolean, tetapi Anda bisa dengan mudah menggunakantrue
dan memeriksanya dengan POSIX tradisionalJika sebagian besar aplikasi Anda membersihkan lingkungan untuk anak-anaknya , tetapi masih tetap
$PATH
tidak berubah, Anda dapat menggunakan ini di pembungkus Anda:dan periksa dengan pencocokan pola seperti bash
[[ "${PATH%RUNNING_FROM_VSCODE}" != "$PATH" ]]
untuk memeriksa apakah melepas suffix dari PATH mengubahnya.Ini seharusnya tidak berbahaya melakukan satu pencarian direktori tambahan ketika program mencari perintah eksternal yang tidak ditemukan.
/dev/null
jelas bukan direktori pada sistem apa pun, jadi aman digunakan sebagai direktori palsu yang akan dengan cepat menghasilkanENOTDIR
jika pencarian PATH tidak menemukan apa yang mereka cari di entri PATH sebelumnya.sumber
Ini 2 sen saya. Cukup tambahkan ke
.bashrc
. Gantiterminals
dengan terminal favorit Anda danexport
perintah dengan terminal Anda.sumber