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?
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...).
@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.
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:
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.
script
et dont le tty est ouvert entraînerait également un faux positif.script
commencé).script
mais aussi d'autres situations, commesu -l
, lassh
console Linux et peut-être d'autres, et fournir (à travers d'autres arguments deps
) beaucoup plus d'informations.Problème intéressant. J'ai trouvé qu'un petit script bash pouvait faire le travail de manière assez fiable:
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.
la source
xterm
depuis 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.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:
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:
Si votre shell actuel est bash, n'oubliez pas de lancer
hash -r
après avoir créé ces fichiers, pour vous assurer que ~ / bin / script est exécuté lorsque 'script' est entré en tant que commande (vérifiez avecwhich script
).Comme précédemment, notez que vous devez avoir ~ / bin dans votre CHEMIN, précédant le chemin standard pour que cela fonctionne.
la source