Como saber se você está em um texto datilografado?

9

Estou usando o comando script para salvar toda a saída do terminal em um arquivo chamado typescript . Ou script foo para salvar no arquivo foo .

Agora, digamos que eu esteja escrevendo comando após comando e esqueço se estou em um texto datilografado ou não.

Como posso saber se estou dentro de um texto datilografado ou não?

    
por Rob Avery IV 20.03.2013 / 15:00

3 respostas

6

Talvez com:

if lsof -tac script "$(tty)" > /dev/null; then
  echo "I'm running under script"
else
  echo "I'm not"
fi

Você pode adicionar algo como:

lsof -tac script "$(tty)" > /dev/null && PS1="[script] $PS1"

Para o seu ~/.zshrc ou ~/.bashrc , as informações sobre se você está em script ou não estarão visíveis no prompt do seu shell.

Alternativamente, se você não pode garantir que lsof esteja instalado, você pode fazer (assumindo um IFS não modificado):

terminal=$(ps -o comm= -p $(ps -o ppid= -p $(ps -o sid= -p "$$")))
[ "$terminal" = script ] && PS1="[script] $PS1"

A heurística é obter o nome do comando do pai do líder da sessão, que geralmente seria o emulador de terminal ( xterm , script , screen ...).

    
por 20.03.2013 / 15:44
5

Problema interessante. Eu encontrei um pequeno script bash poderia fazer o trabalho de forma bastante confiável:

#!/bin/bash

PP=$(ps -o ppid= $$)

while [[ $PP != 1 ]]
do
    LINE=$(ps -o ppid= -o comm= $PP | sed 's/^  *//')
    COMM=${LINE#* }
    PP=${LINE%% *}
    if [[ $COMM == script ]]  # Might need a different comparison
    then
        echo "In script"
        exit 0
    fi
done
echo "Not in script"

Eu acho que isso é um pouco diferente do proposto por Stephane Chazelas, em que meu script funciona até o relacionamento pai: filho que os processos Linux / Unix têm até encontrar o PID 1, ou encontra "script" como o processo.

    
por 20.03.2013 / 17:34
0

Se você tiver um bin / diretório pessoal em seu caminho (por exemplo, / home / user / bin, coloque um script de shell lá com o nome 'script' (mesmo nome que o binário), com o seguinte conteúdo:

#!/bin/bash
export SCRIPT_RUNNING=1
exec /usr/bin/script # full path to your script(1) binary

Agora, dentro do script em execução, você pode testar a variável de ambiente SCRIPT_RUNNING e fazer o que quiser com base nela.

EDITAR:

Na verdade, há um jeito muito mais fácil. O seguinte diz tudo, crie três arquivos, ~ / bin / script, ~ / bin / script-shell e ~ / .scriptrc:

~ > ls ~/bin/script ~/bin/script-shell ~/.scriptrc
-rw-r--r-- 1 roadowl users 23 Oct 18 16:52 /home/roadowl/.scriptrc
-rwx------ 1 roadowl users 49 Oct 18 16:53 /home/roadowl/bin/script
-rwx------ 1 roadowl users 56 Oct 18 16:55 /home/roadowl/bin/script-shell

~/bin > cat script
#!/bin/bash
exec /usr/bin/script -c script-shell

~/bin > cat script-shell
#!/bin/bash
exec /bin/bash --rcfile /home/bjd/.scriptrc

~/bin > cat ~/.scriptrc
export PS1="[script] "

Se o seu shell atual é bash, não se esqueça de executar hash -r depois de criar esses arquivos, para garantir que ~ / bin / script seja executado quando 'script' for digitado como um comando (verifique com which script ).

Como antes, observe que você deve ter ~ / bin em seu PATH, precedendo o caminho padrão para que isso funcione.

    
por 18.10.2016 / 16:27

Tags