Dalam metode kedua yang diusulkan oleh halaman ini , seseorang mendapatkan tty di mana bash dijalankan dengan perintah:
ps ax | grep $$ | awk '{ print $2 }'
Saya pikir pada diri saya sendiri bahwa ini agak malas, mendaftar semua proses yang berjalan hanya untuk mengekstrak salah satunya. Apakah itu tidak lebih efisien (saya juga bertanya apakah ini akan menimbulkan efek yang tidak diinginkan) untuk dilakukan:
ps -p $$ | tail -n 1 | awk '{ print $2 }'
FYI, saya menemukan masalah ini karena kadang-kadang perintah pertama benar-benar menghasilkan dua (atau lebih) baris. Ini akan terjadi secara acak, ketika akan ada proses lain yang berjalan dengan PID yang berisi $$
sebagai substring. Dalam pendekatan kedua, saya menghindari kasus-kasus seperti itu dengan meminta PID yang saya tahu saya inginkan.
tty
perintah dalam sesi bash Anda. Jika Anda bersikeras menggunakanps
-ps -p $$ -o tty=
Jawaban:
Cukup dengan mengetik
tty
:Terlalu sederhana dan jelas untuk menjadi kenyataan :)
Sunting: Yang pertama mengembalikan Anda juga
pty
dari proses yang berjalangrep
karena Anda dapat melihat:karena itu Anda perlu memfilter grep untuk mendapatkan hanya satu hasil, yang semakin jelek:
atau menggunakan
(varian yang lebih waras)
sumber
tty | sed -e "s:/dev/::"
). Tapi saya pikir solusi kedua yang disarankan pada halaman itu tidak hanya tidak efisien, tetapi juga salah! Saya akan menggunakantty
dan berhenti mengeluh. :)pty
proses yang berjalangrep
seperti yang Anda sadari.grep
jika menggunakanawk
. misalnyaps ax | awk "/^$$/ {print \$2}"
- perhatikan penggunaan tanda kutip ganda daripada tanda kutip tunggal dan lolos\$2
. Tetapi, seperti yang Anda katakan, menggunakantty
adalah solusi yang tepat.awk -vpid=$$ '$1 == pid {print $2}'
tty
di node.js tidak bekerja sama sekali, sementaraps
dan teman-teman bekerja dengan baik.Jika Anda ingin lebih efisien, maka ya, Anda benar yang
ps
dapat memfilter hanya proses yang dimaksud (dan itu akan lebih benar, tidak menjalankan risiko mengambil perintah yang kebetulan memiliki nomor proses Anda dalam nama mereka. ). Tidak hanya itu, tetapi dapat dikatakan untuk tidak menghasilkan header (opsih
), menghilangkantail
proses, dan hanya menampilkanTTY
bidang (opsio tty
), menghilangkanawk
proses.Jadi, inilah perintah Anda yang dikurangi:
sumber
Cara lain untuk melakukannya:
(Jika Anda berada di shell yang stdin, stdout, dan stderr tidak terhubung ke terminal pengendali, Anda bisa mendapatkan deskriptor resmi ke terminal pengendali dengan membuka
/dev/tty
:)
Atau dengan
ps
:sumber
/dev/tty
, dan bukan tty pengendali (seperti yang dilaporkan olehps
). (2) Saya percaya itu{ readlink /dev/fd/0; } < /dev/tty
(dan akan selalu) setara denganreadlink /dev/fd/0 < /dev/tty
- apakah Anda percaya sebaliknya? Jika demikian, dapatkah Anda membenarkannya? (3) Titik koma kedua di perintah Anda (yang setelah/dev/tty
) tidak perlu.Hanya untuk kelengkapan, sementara perintah ps lain yang disebutkan berfungsi di Linux,
ps -p $$ -o tty=
(sebagaimana disebutkan oleh @ 1_CR) adalah yang paling portabel untuk semua sistem Unix modern, karena hanya menggunakan opsi yang ditentukan dalam Standar Unix .sumber
Dalam shell interaktif, seseorang dapat menggunakan
w
perintah untuk itu. Dalam contoh di bawah ini,w
laporan itu sendiri dijalankan oleh pengguna tertentu, dan tentu saja itu menunjukkan TTY di mana perintah itu dijalankan.sumber