bashのようなシェルで未使用のttyを探していますか?

bashのようなシェルで未使用のttyを探していますか?

ttyたとえば、シェルで未使用のコンテンツを見つける一般的な方法はありますかbash

これはうまくいくようですが、より良い方法があるようです。

$ used=$({ find /proc/{0..9}*/fd/0 -printf '%l$\n' | grep tty;} 2> /dev/null)
$ unused=$(find /dev/ -name 'tty*' | grep -ve "$used")

答え1

Linux仮想端末を参照すると仮定すると、次のようになりVT_OPENQRY ioctl()ます。最初無料の仮想端末(使用済み端末などopenvt)ですが、コンソールデバイスのファイル記述子はすでに必要です。または、root として以下を実行できます。

comm -23 <(printf '%s\n' /dev/tty[1-9]*) \
         <(lsof -Fn /dev/tty[1-9]* | sed -n 's/^n//p' | sort -u)

これは、シリアルデバイスなどの他の種類のttyデバイスに一般化できます。

/dev/ttyxxこれは、これらのデバイスパスのみを考慮し、正規表現演算子または改行文字を含むファイル名に問題がないため、より強力です。ただし、ttyデバイスが別のパスを開いている場合、アプローチと同様に、この方法は正しく機能しません。

別のアプローチは、装置番号の代わりに装置番号に依存することである。モデル道。

GNUの使用stat:

find -L /proc/[1-9]*/fd/. ! -name . -prune -type c -exec  stat -Lc '%t %T' {} + |
  awk '$1 == "4" {seen[$2]}
       END {
         for (i=1; i<=63; i++)
           if (!(sprintf("%x", i) in seen))
             print "/dev/tty" i
       }'

関連情報