Jak się dowiedzieć, czy masz maszynopis?

11

Korzystam z scriptpolecenia, aby zapisać wszystkie dane wyjściowe z terminala w pliku o nazwie typescript. Lub script foozapisać w pliku foo.

Teraz powiedzmy, że idę wpisywać polecenie po poleceniu i zapominam, czy jestem na maszynie, czy nie.

Jak mogę się dowiedzieć, czy jestem w maszynie do pisania, czy nie?

Rob Avery IV
źródło

Odpowiedzi:

7

Może z:

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

Możesz dodać coś takiego:

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

Dla twojego ~/.zshrclub ~/.bashrc, więc informacja o tym, czy jesteś w, scriptczy nie, będzie widoczna w zachęcie powłoki.

Alternatywnie, jeśli nie możesz zagwarantować, że lsofzostanie zainstalowany, możesz to zrobić (zakładając niezmodyfikowany IFS):

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

Heurystyczny jest uzyskać nazwę polecenia rodzica lidera sesji, która generalnie byłby emulator terminala ( xterm, script, screen...).

Stéphane Chazelas
źródło
1
@teikakazura, heurystyczna część była dlatego, że nie masz gwarancji, że będzie to proces nadrzędny lidera sesji. Nie ma tu nic wspólnego z ponownym użyciem pid jako lidera sesji i jego rodzica, które zwykle będą nadal dostępne po uruchomieniu tego polecenia. Można powiedzieć, że pierwszy jest heurystyczny, a my tylko sprawdzamy nazwę procesu. Każde polecenie, którego nazwa jest również scripti ma otwarte tty, również spowoduje fałszywy alarm.
Stéphane Chazelas
1
@teikakazura About (2), który sprawdziłby ppid bieżącej powłoki. Tutaj chcesz sprawdzić ppid lidera sesji (zwykle jest to powłoka, która się scripturuchomiła).
Stéphane Chazelas
Nie mogę zrozumieć @StephaneChazelas komentarz tutaj (co jest „(2)”, prawdopodobnie usuniętego komentarza), ale druga część odpowiedzi jest bardzo interesujący, ponieważ może wykryć nie tylko script, ale także inne sytuacje, jak su -l, sshkonsola i Linux być może inni i dostarczają (poprzez inne argumenty ps) znacznie więcej informacji.
Stéphane Gourichon,
5

Ciekawy problem. Zauważyłem, że mały skrypt bash mógłby wykonać tę pracę całkiem niezawodnie:

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

Myślę, że jest to nieco inne niż zaproponowane przez Stephane Chazelas, ponieważ mój skrypt działa w górę nadrzędny: relacja potomna zachodząca w procesach Linux / Unix do momentu znalezienia PID 1 lub znalezienia „skryptu” jako procesu.

Bruce Ediger
źródło
4
Ciekawe podejście Pamiętaj jednak, że jeśli na przykład rozpoczniesz xtermsesję skryptu, skrypt sprawi, że powłoka w Xterm działa pod skryptem. Cóż, jest to w pewien sposób, ale dane wyjściowe nie trafiają do maszynopisu. Moje podejście sprawdza terminal związany z bieżącą sesją, aby nie mieć tego problemu.
Stéphane Chazelas
0

Jeśli masz osobisty katalog bin / na swojej ścieżce (np. / Home / user / bin, umieść tam skrypt powłoki o nazwie „skrypt” (taka sama jak nazwa pliku binarnego), o następującej treści:

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

Teraz, w ramach uruchomionego skryptu, możesz przetestować zmienną środowiskową SCRIPT_RUNNING i na tej podstawie zrobić wszystko, co chcesz.

EDYTOWAĆ:

W rzeczywistości jest o wiele łatwiejszy sposób. Poniższe słowa mówią wszystko, utwórz trzy pliki: ~ / bin / script, ~ / bin / script-shell i ~ / .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] "

Jeśli twoja bieżąca powłoka jest bash, nie zapomnij uruchomić hash -rpo utworzeniu tych plików, aby upewnić się, że ~ / bin / script jest uruchamiany, gdy „skrypt” zostanie wprowadzony jako polecenie (sprawdź za pomocą which script).

Tak jak poprzednio, pamiętaj, że musisz mieć ~ / bin w ŚCIEŻCE, poprzedzającej standardową ścieżkę, aby to zadziałało.

Roadowl
źródło