Hangi bash çalıştıran tty almak için?


24

Bu sayfa tarafından önerilen ikinci yöntemde , bash komutunun çalıştırıldığı tty'yi alır:

ps ax | grep $$ | awk '{ print $2 }'

Bence bu kesinlikle biraz tembel, ancak bunlardan sadece birini çıkarmak için çalışan tüm süreçleri listeliyordum. Daha verimli olmaz mıydı (Ayrıca istenmeyen etkiler doğuracak mı diye soruyorum):

ps -p $$ | tail -n 1 | awk '{ print $2 }'

Bilginize, bu sorunla karşılaştım çünkü bazen ilk komut aslında iki (veya daha fazla) satır verecekti. Bu, $$alt dize olarak içeren bir PID ile çalışan başka bir işlem olduğunda rastgele olur . İkinci yaklaşımda, istediğim PID'yi isteyerek bu tür durumlardan kaçınıyorum.


6
hepsinden daha verimli olanı ttybash oturumunuzdaki komutu çalıştırmak olacaktır . Eğer kullanmakta ısrar ederseniz ps-ps -p $$ -o tty=
iruvar

Yanıtlar:


46

Basitçe yazarak tty:

$ tty 
/dev/pts/20

Gerçek olamayacak kadar basit ve açık :)

Düzenleme: Birincisi , sizi de fark edebileceğiniz gibi ptyçalışan sürecin geri döndürür grep:

$ ps ax | grep $$
28295 pts/20   Ss     0:00 /bin/bash
29786 pts/20   S+     0:00 grep --color=auto 28295

bu nedenle, çirkin hale gelen tek bir sonuç elde etmek için grep'i filtrelemeniz gerekir:

ps ax | grep $$ | grep -v grep | awk '{ print $2 }'

veya kullanma

ps ax | grep "^$$" | awk '{ print $2 }'

(daha aklı başında bir değişken)


Evet, bu gerçekten önerilen ilk çözümdür (aslında öyledir tty | sed -e "s:/dev/::"). Ancak bu sayfada önerilen ikinci çözümün sadece verimsiz değil, aynı zamanda yanlış olduğunu da düşünüyorum! Kullanacağım ttyve şikayet etmeyi bırakacağım. :)
Sheljohn

Birincisi , sizi de fark ettiğiniz gibi ptyçalışan sürecin geri döndürür grep.
Jakuje

2
Buna gerek yok grepkullandığınız takdirde awk. örneğin ps ax | awk "/^$$/ {print \$2}"- tekli tırnaklar ve kaçanlar yerine çift tırnakların kullanıldığına dikkat edin \$2. Ancak, dediğiniz gibi, kullanmak ttydoğru çözümdür.
cas

Bunun gibi bir hata yapmak yanlış eşleşmelere neden olabilir, örneğin PID'niz 10 ise ve ayrıca bir PID 103 varsa. Kullanınawk -vpid=$$ '$1 == pid {print $2}'
Barmar

Ben sadece burada ttynode.js'de ortaya çıkmanın hiç işe yaramadığını psve arkadaşlar iyi çalıştığını belirtiyorum .
Steven Lu,

17

Daha verimli olmak istiyorsanız, o zaman evet, pssadece söz konusu işleme filtre uygulayabilirsiniz (ve daha doğru olacaktır, işlem numaranızın adlarına sahip olan komutları alma riski yoktur). ). Sadece bu değil, başlığın (isteğe bağlı h) üretilmemesi , tailişlemin ortadan kaldırılması ve işlemin ortadan kaldırılması için sadece TTYalanın (seçenek o tty) gösterilmesi söylenemez awk.

İşte indirgenmiş emriniz:

ps hotty $$

10

Bunu yapmanın diğer yolları:

readlink /dev/fd/0     #or 1 or 2 
readlink /proc/self/fd/0 #or 1 or 2
readlink -f /dev/stdin #or stdout or stderr; f to resolve recursively
#etc.

(Eğer stdin, stdout ve stderr kontrol terminaline bağlı olmayan bir kabuktaysanız, açarak kontrol terminaline dosya tanıtıcısı alabilirsiniz. /dev/tty :

( { readlink /dev/fd/0; } </dev/tty; ) </dev/null  >output 2>&1

)

Veya ps:

ps h -o tty -p $$ #no header (h); print tty column; for pid $$

2
(1) Bir sürecin şu anki / kontrol eden biçiminin herhangi bir dosya tanımlayıcısı ile ilişkili olmadığına ve herhangi bir fd'de açık olma garantisine sahip olmadığına sevindim. Ancak, bu beklenmedik durum için geçici bir çözüm olarak sunduğunuz komutu denediniz mi? Bunu denediğimde, elde ettiğim tek /dev/ttyşey, kontrol tty'i (bildirildiği gibi ps) değil. (2) Bunun { readlink /dev/fd/0; } < /dev/ttyeşittir (ve her zaman olacağına) readlink /dev/fd/0 < /dev/ttyinanıyorum - aksi halde inanıyor musunuz? Eğer öyleyse, haklı gösterebilir misin? (3) Komutunuzdaki ikinci noktalı virgül (sonrasındaki /dev/tty) gereksizdir.
Scott

6

Sadece bütünlük için, söz konusu diğer ps komutları Linux üzerinde çalışırken, ps -p $$ -o tty=(@ 1_CR'nin dediği gibi) tüm Unix sistemlerinde en taşınabilir olanıdır, çünkü yalnızca Unix Standardında tanımlanan seçenekleri kullanır .


2

Etkileşimli kabukta bunun için bir wkomut kullanılabilir . Aşağıdaki örnekte, wbelirli bir kullanıcı tarafından çalıştırıldığını bildirir ve elbette bu komutun çalıştırıldığı TTY'yi gösterir.

$ w
 11:20:08 up 5 min,  3 users,  load average: 0.34, 0.39, 0.20
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
xieerqi  :0       :0               11:15   ?xdm?   1:47   0.34s init --user
xieerqi  pts/0    :0               11:18   23.00s  0.05s  0.05s /bin/mksh
xieerqi  pts/10   :0               11:20    0.00s  0.03s  0.01s w
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.