Um rascunho de trabalho para um shell tradicional:
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
Agora podemos colocar a tela em um arquivo. Precisa de sudo.
id=${ttyid//\/dev\/tty}
sudo cat /dev/vcs$id > screen.dump
A propósito screendump
: o programa chamado não funciona mais para mim. Talvez apenas para kernels antigos. / dev / pts / N também não funcionou para mim. Talvez você precise de algum MKDEV opcional em / dev - lembro-me sombriamente de alguns /dev/cuaN
, mas posso estar errado.
Gostaríamos de canalizar a saída em vez de usar screen.dump. Mas de alguma forma isso não funciona - às vezes aguarda ENTER.
A captura não é um arquivo de texto normal com alimentações de linha, mas com - por exemplo - caracteres de 80 x 50 em uma sequência.
Para escolher as duas últimas linhas, uma para a saída do comando e uma para a linha de prompt, eu a reverto, pego 160 caracteres, reverto novamente e escolha 80.
rev vcs4.dat | sed 's/\(.\{160\}\).*/\1/g' | rev | sed 's/\(.\{80\}\).*/\1/g'
Caso você já tenha se perguntado, por que existe um rev
programa?
Crítica:
- Os primeiros comandos são inseridos, movendo a linha ahed. Bem - apenas um exercício numérico para escolher a terceira linha final ou algo assim. Eu trabalhei principalmente em uma janela diferente.
- Nem todo mundo tem uma tela de 80x50. Bem, sim, nós sabemos. Existem $ COLUMNS e $ ROWS para seu prazer.
- A saída não está sempre na parte inferior. Uma concha fresca e jovem pode estar nas fileiras superiores. Bem - simples assim: avalie qual shell está sendo executado. Qual prompt é usado. Faça alguma detecção imediata e encontre a última linha com um prompt de shell. A linha anterior (ou 2. anterior) deve conter o diretório
O primeiro diagrama é feito com o explica.py