¿Cómo saber si estás en un mecanografiado?

11

Estoy usando el scriptcomando para guardar toda la salida del terminal en un archivo llamado typescript. O script foopara guardar en el archivo foo.

Ahora, digamos que sigo escribiendo comando tras comando y olvido si estoy en un mecanografiado o no.

¿Cómo puedo saber si estoy dentro de un mecanografiado o no?

Rob Avery IV
fuente

Respuestas:

7

Quizás con:

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

Podrías agregar algo como:

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

Para su ~/.zshrco ~/.bashrc, por lo que la información sobre si está scripto no estará visible en su indicador de shell.

Alternativamente, si no puede garantizar que lsofse instale, puede hacerlo (suponiendo un IFS no modificado):

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

La heurística es conseguir que el nombre de la orden de los padres del líder de la sesión que generalmente sería el emulador de terminal ( xterm, script, screen...).

Stéphane Chazelas
fuente
1
@teikakazura, la parte heurística fue porque no tienes la garantía de que será el proceso principal del líder de la sesión. Aquí no tiene nada que ver con la reutilización de pid, ya que el líder de la sesión y su padre normalmente estarán presentes cuando ejecute ese comando. Se podría decir que el primero es heurístico y que solo estamos verificando el nombre del proceso. Cualquier comando cuyo nombre también sea scripty tenga el tty abierto también causaría un falso positivo.
Stéphane Chazelas
1
@teikakazura Acerca de (2), eso verificaría el ppid del shell actual. Aquí, desea verificar el ppid del líder de la sesión (normalmente, ese sería el shell que scriptcomenzó).
Stéphane Chazelas
No puedo entender @StephaneChazelas comentario aquí (lo que es "(2)", probablemente un comentario eliminado), pero la segunda parte de la respuesta es muy interesante, ya que puede detectar no sólo script, sino también otras situaciones, como su -l, ssh, consola de Linux y quizás otros, y brindan (a través de otros argumentos de ps) mucha más información.
Stéphane Gourichon
5

Interesante problema Encontré que un pequeño script bash podría hacer el trabajo de manera bastante confiable:

#!/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"

Creo que esto es ligeramente diferente de lo propuesto por Stephane Chazelas, ya que mi secuencia de comandos se abre paso en la relación padre: hijo que tienen los procesos Linux / Unix hasta que encuentra PID 1, o encuentra "secuencia de comandos" como el proceso.

Bruce Ediger
fuente
44
Enfoque interesante Sin embargo, tenga en cuenta que si, por ejemplo, inicia una xtermsesión de secuencia de comandos, esa secuencia de comandos incluirá el shell en que xterm se ejecuta bajo secuencia de comandos. Bueno, de alguna manera, pero el resultado no va al mecanografiado. Mi enfoque verifica el terminal asociado con la sesión actual, por lo que no tendría ese problema.
Stéphane Chazelas
0

Si tiene un directorio bin / personal en su ruta (por ejemplo, / home / user / bin, coloque allí un script de shell con el nombre 'script' (el mismo nombre que el binario), con el siguiente contenido:

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

Ahora, dentro de la ejecución del script, puede probar la variable de entorno SCRIPT_RUNNING y hacer lo que quiera en función de ella.

EDITAR:

En realidad, hay una manera mucho más fácil. Lo siguiente lo dice todo: cree tres archivos, ~ / bin / script, ~ / bin / script-shell y ~ / .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] "

Si su shell actual es bash, no olvide ejecutar hash -rdespués de crear estos archivos, para asegurarse de que ~ / bin / script se ejecute cuando se ingrese 'script' como un comando (consulte con which script).

Como antes, tenga en cuenta que debe tener ~ / bin en su RUTA, precediendo la ruta estándar para que esto funcione.

Roadowl
fuente