Comment savoir si vous êtes dans un tapuscrit?

J'utilise la command de script pour save toutes les sorties du terminal dans un file appelé typescript . Ou script foo pour save dans le file foo .

Maintenant, disons que je vais dactylographier le commandment après command et j'oublie si oui ou non je suis dans un tapuscrit ou non.

Comment puis-je savoir si je suis dans un tapuscrit ou non?

Peut-être avec:

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

Vous pourriez append quelque chose comme:

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

Pour votre ~/.zshrc ou ~/.bashrc , de sorte que les informations sur si vous êtes dans le script ou non seraient visibles sur votre invite du shell.

Sinon, si vous ne pouvez pas garantir que lsof soit installé, 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 consiste à get le nom de la command du parent du chef de session qui serait généralement l'émulateur de terminal ( xterm , script , screen …).

Problème intéressant. J'ai trouvé un petit script bash capable de faire le travail assez sûrement:

 #!/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 c'est un peu différent de celui proposé par Stéphane Chazelas, en ce sens que mon script va jusqu'à la relation parent / enfant que les process Linux / Unix ont jusqu'à ce qu'il trouve le PID 1 ou qu'il trouve le script comme process.

Si vous avez un directory bin / directory personnel dans votre path (par exemple / home / user / bin, placez un script shell avec le nom 'script' (le même nom que le binary) avec le contenu suivant:

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

Maintenant, dans le script en cours d'exécution, vous pouvez tester la variable d'environnement SCRIPT_RUNNING, et faire ce que vous voulez en fonction.

MODIFIER:

En fait, il y a un moyen beaucoup plus facile. Ce qui suit dit tout, créer trois files, ~ / 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 d'exécuter hash -r après avoir créé ces files, pour vous assurer que ~ / bin / script est exécuté quand 'script' est entré en tant que command (vérifiez avec which script ).

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