Comment savoir si vous êtes en dactylographie?

11

J'utilise la scriptcommande pour enregistrer toutes les sorties du terminal dans un fichier appelé typescript. Ou script foopour enregistrer dans le fichier foo.

Maintenant, disons que je continue à taper commande après commande et que j'oublie si je suis ou non en tapuscript.

Comment puis-je savoir si je suis dans un texte dactylographié ou non?

Rob Avery IV
la source

Réponses:

7

Peut-être avec:

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

Vous pouvez ajouter quelque chose comme:

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

À votre ~/.zshrcou ~/.bashrc, les informations indiquant si vous êtes scriptou non seront visibles sur votre invite de shell.

Alternativement, si vous ne pouvez pas garantir lsofl'installation, vous pouvez le faire (en supposant un IFS non modifié):

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

L'heuristique est d'obtenir le nom de la commande du parent du chef de session qui serait généralement l'émulateur de terminal ( xterm, script, screen...).

Stéphane Chazelas
la source
1
@teikakazura, la partie heuristique était parce que vous n'êtes pas assuré que ce sera le processus parent du chef de session. Rien à voir avec la réutilisation de pid ici car votre chef de session et son parent seront toujours présents lorsque vous exécuterez cette commande. Vous pourriez dire que la première est heuristique et que nous vérifions simplement le nom du processus. Toute commande dont le nom est également scriptet dont le tty est ouvert entraînerait également un faux positif.
Stéphane Chazelas
1
@teikakazura About (2), qui vérifierait le ppid du shell actuel. Ici, vous voulez vérifier le ppid du chef de session (ce serait généralement le shell qui a scriptcommencé).
Stéphane Chazelas
Je ne comprends pas le commentaire de @StephaneChazelas ici (qu'est-ce que "(2)", probablement un commentaire supprimé), mais la deuxième partie de la réponse est très intéressante car elle peut détecter non seulement scriptmais aussi d'autres situations, comme su -l, la sshconsole Linux et peut-être d'autres, et fournir (à travers d'autres arguments de ps) beaucoup plus d'informations.
Stéphane Gourichon
5

Problème intéressant. J'ai trouvé qu'un petit script bash pouvait faire le travail de manière assez fiable:

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

Je pense que cela est légèrement différent de celui proposé par Stéphane Chazelas, en ce sens que mon script remonte la relation parent: enfant que les processus Linux / Unix ont jusqu'à ce qu'il trouve le PID 1, ou qu'il trouve "script" comme processus.

Bruce Ediger
la source
4
Approche intéressante. Cependant, notez que si, par exemple, vous démarrez un xtermdepuis votre session de script, ce script remplira le shell dans lequel xterm s'exécute sous script. Eh bien, c'est en quelque sorte, mais la sortie ne va pas au tapuscrit. Mon approche vérifie le terminal associé à la session en cours et n'aurait donc pas ce problème.
Stéphane Chazelas
0

Si vous avez un répertoire bin / personnel dans votre chemin (par exemple / home / user / bin, placez-y un script shell avec le nom 'script' (même nom que le binaire), avec le contenu suivant:

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

Maintenant, pendant l'exécution du script, vous pouvez tester la variable d'environnement SCRIPT_RUNNING et faire tout ce que vous voulez en fonction de celle-ci.

ÉDITER:

En fait, il existe un moyen beaucoup plus simple. Ce qui suit dit tout, créez trois fichiers, ~ / bin / script, ~ / bin / script-shell et ~ / .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 votre shell actuel est bash, n'oubliez pas de lancer hash -raprès avoir créé ces fichiers, pour vous assurer que ~ / bin / script est exécuté lorsque 'script' est entré en tant que commande (vérifiez avec which script).

Comme précédemment, notez que vous devez avoir ~ / bin dans votre CHEMIN, précédant le chemin standard pour que cela fonctionne.

Roadowl
la source