Come sapere se sei in un dattiloscritto?


11

Sto usando il scriptcomando per salvare tutto l'output dal terminale in un file chiamato typescript. O script fooper salvare nel file foo.

Ora, diciamo che sto andando avanti digitando comando dopo comando e dimentico se sono o meno in un dattiloscritto.

Come posso sapere se mi trovo all'interno di un dattiloscritto o no?

Risposte:


7

Forse con:

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

Potresti aggiungere qualcosa come:

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

Al tuo ~/.zshrco ~/.bashrc, quindi le informazioni sul fatto che tu sia dentro scripto meno sarebbero visibili sul tuo prompt della shell.

In alternativa, se non è possibile garantire l' lsofinstallazione, è possibile farlo (presupponendo un IFS non modificato):

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

L'euristica è quello di ottenere il nome del comando del genitore del leader di sessione che in genere sarebbe l'emulatore di terminale ( xterm, script, screen...).


1
@teikakazura, la parte euristica era perché non sei sicuro che sarà il processo genitore del leader della sessione. Nulla a che fare con il riutilizzo di pid qui, poiché il leader della sessione e il relativo genitore resteranno in genere ancora quando esegui quel comando. Si potrebbe dire che il primo è euristico e stiamo solo verificando il nome del processo. Qualsiasi comando il cui nome è anche scripte che ha il tty aperto provocherebbe anche un falso positivo.
Stéphane Chazelas,

1
@teikakazura About (2), che verificherebbe il ppid della shell corrente. Qui, vuoi controllare il ppid del leader della sessione (in genere, sarebbe la shell che è stata scriptavviata).
Stéphane Chazelas,

Non riesco a capire il commento di @StephaneChazelas qui (che cos'è "(2)", probabilmente un commento eliminato), ma la seconda parte della risposta è molto interessante in quanto è in grado di rilevare non solo scriptma anche altre situazioni, come su -l, sshconsole Linux e forse altri, e forniscono (attraverso altri argomenti di ps) molte più informazioni.
Stéphane Gourichon,

5

Problema interessante. Ho scoperto che un piccolo script bash potrebbe fare il lavoro in modo abbastanza affidabile:

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

Penso che questo sia leggermente diverso da quello proposto da Stephane Chazelas, in quanto la mia sceneggiatura si fa strada fino al genitore: relazione figlio che i processi Linux / Unix hanno fino a quando non trova PID 1 o trova "script" come processo.


4
Approccio interessante Tuttavia, si noti che se, ad esempio, si avvia una xtermsessione di script, tale script farà eseguire la shell in quel xterm sotto script. Bene, in un certo senso, ma l'output non sta andando al dattiloscritto. Il mio approccio controlla il terminale associato alla sessione corrente, quindi non avrebbe questo problema.
Stéphane Chazelas,

0

Se hai un bin / directory personale nel tuo percorso (es. / Home / user / bin, posiziona lì uno script shell con il nome 'script' (stesso nome del binario), con il seguente contenuto:

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

Ora, all'interno dello script in esecuzione, è possibile verificare la variabile di ambiente SCRIPT_RUNNING e fare ciò che si desidera sulla base di esso.

MODIFICARE:

In realtà, c'è un modo molto più semplice. Quanto segue dice tutto, crea tre file, ~ / 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 la tua shell corrente è bash, non dimenticare di eseguire hash -rdopo aver creato questi file, per assicurarti che ~ / bin / script venga eseguito quando 'script' viene inserito come comando (controlla con which script).

Come prima, nota che devi avere ~ / bin nel tuo PERCORSO, prima che il percorso standard funzioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.