Roboczy projekt tradycyjnej powłoki:
ttyid=$(readlink /proc/$$/fd/1)
\___/ \______/ \___/ | | |
| | | | | \- 0: stdin
| | | | | 1: stdout <- our interest
| | | | | 2: stderr
| | | | \- fd is, maybe, filedescriptor
| | | |
| | | \- $$ is the PID of the current process (shell,
| | | in our case)
| | |
| | \- you know, much runtime stuff is here
| |
| \- readlink extracts the symbolic link of /proc/$$/fd/1
| lrwx------ 1 stefan stefan 64 2011-03-18 09:11
| /proc/22159/fd/1 -> /dev/pts/4
|
\- /dev/tty3 for real shell, /dev/pts/3 for xterm
Teraz możemy przechwycić ekran do pliku. Potrzebuje sudo.
id=${ttyid//\/dev\/tty}
sudo cat /dev/vcs$id > screen.dump
Apropos screendump
: tak nazwany program już dla mnie nie działa. Może tylko dla starszych jąder. / dev / pts / N też dla mnie nie działał. Może masz jakieś opcjonalne MKDEV w / dev - o niektórych pamiętam ponuro /dev/cuaN
, ale mogę się mylić.
Chcielibyśmy przesyłać dane wyjściowe zamiast używać screen.dump. Ale jakoś to nie działa - czasami czeka na ENTER.
Przechwytywanie nie jest zwykłym plikiem tekstowym z liniami, ale z - na przykład - znakami 80x50 w jednej sekwencji.
Aby wybrać ostatnie 2 wiersze, 1 dla wyniku polecenia i jeden dla wiersza polecenia, cofam go, wybieram 160 znaków, cofam ponownie i wybieram 80.
rev vcs4.dat | sed 's/\(.\{160\}\).*/\1/g' | rev | sed 's/\(.\{80\}\).*/\1/g'
Na wszelki wypadek zastanawiałeś się, dlaczego istnieje rev
program.
Krytyka:
- Wprowadzane są pierwsze polecenia, przesuwając linię. Cóż - po prostu ćwiczenie numeryczne, aby wybrać trzecią ostatnią linię lub coś takiego. Pracowałem głównie w innym oknie.
- Nie każdy ma ekran 80x50. No tak, wiemy. Dla Twojej przyjemności są $ COLUMNS i $ ROWS.
- Wynik nie zawsze jest na dole. Świeża i młoda skorupa może znajdować się w wyższych rzędach. Cóż - to proste: oceń, która powłoka działa. Który monit jest używany. Wykonaj szybkie wykrywanie i znajdź ostatni wiersz za pomocą polecenia powłoki. Linia przed (lub 2. przed) powinna zawierać katalog.
Pierwszy schemat jest wykonany za pomocą replace.py