Woher wissen Sie, ob Sie in einem Typoskript sind?

11

Ich verwende den scriptBefehl, um die gesamte Ausgabe vom Terminal in einer aufgerufenen Datei zu speichern typescript. Oder script fooum in der Datei zu speichern foo.

Nehmen wir jetzt an, ich tippe Befehl für Befehl ein und vergesse, ob ich in einem Typoskript bin oder nicht.

Wie kann ich herausfinden, ob ich mich in einem Typoskript befinde oder nicht?

Rob Avery IV
quelle

Antworten:

7

Vielleicht mit:

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

Sie könnten etwas hinzufügen wie:

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

Zu Ihrem ~/.zshrcoder ~/.bashrc, so werden die Informationen darüber, ob Sie sich in befinden scriptoder nicht, auf Ihrer Shell-Eingabeaufforderung angezeigt.

Wenn Sie nicht garantieren können, dass lsofdie Installation durchgeführt wird, können Sie dies auch tun (unter der Annahme eines unveränderten IFS):

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

Die Heuristik ist auf die Befehlsnamen der Mutter des Sitzungsleiters zu erhalten , die im Allgemeinen der Terminalemulator wäre ( xterm, script, screen...).

Stéphane Chazelas
quelle
1
@teikakazura, der heuristische Teil war, weil Sie nicht garantiert sind, dass es der übergeordnete Prozess des Sitzungsleiters sein wird. Hier hat nichts mit der Wiederverwendung von PID zu tun, da Ihr Sitzungsleiter und sein übergeordnetes Element normalerweise immer noch verfügbar sind, wenn Sie diesen Befehl ausführen. Man könnte sagen, dass der erste heuristisch ist und wir nur den Prozessnamen überprüfen. Jeder Befehl, dessen Name ebenfalls lautet scriptund dessen tty geöffnet ist, würde ebenfalls ein falsches Positiv verursachen.
Stéphane Chazelas
1
@teikakazura About (2), das würde die ppid der aktuellen Shell überprüfen. Hier möchten Sie die ppid des Sitzungsleiters überprüfen (normalerweise ist dies die Shell, die scriptgestartet wurde).
Stéphane Chazelas
Ich kann nicht verstehen @StephaneChazelas Kommentar hier (was ist „(2)“, wahrscheinlich einen gelöschtes Kommentar), aber der zweite Teil der Antwort ist sehr interessant , da es nicht nur erkennen kann , scriptsondern auch andere Situationen, wie su -l, ssh, Linux - Konsole und vielleicht andere und liefern (durch andere Argumente ps) viel mehr Informationen.
Stéphane Gourichon
5

Interessantes Problem. Ich fand, dass ein kleines Bash-Skript die Arbeit ziemlich zuverlässig erledigen kann:

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

Ich denke, dies ist etwas anders als von Stephane Chazelas vorgeschlagen, da sich mein Skript in der Eltern-Kind-Beziehung nach oben arbeitet, die Linux / Unix-Prozesse haben, bis es PID 1 findet, oder es findet "Skript" als Prozess.

Bruce Ediger
quelle
4
Interessanter Ansatz. Beachten Sie jedoch, dass, wenn Sie beispielsweise eine xtermvon Ihrer Skriptsitzung aus starten , dieses Skript die Shell in diesem xterm unter Skript ausführt. Nun, es ist in gewisser Weise, aber die Ausgabe geht nicht zum Typoskript. Mein Ansatz überprüft das mit der aktuellen Sitzung verknüpfte Terminal, sodass dieses Problem nicht auftritt.
Stéphane Chazelas
0

Wenn Sie ein persönliches bin / -Verzeichnis in Ihrem Pfad haben (z. B. / home / user / bin, platzieren Sie dort ein Shell-Skript mit dem Namen 'script' (gleicher Name wie die Binärdatei) mit folgendem Inhalt:

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

Jetzt können Sie innerhalb des ausgeführten Skripts die Umgebungsvariable SCRIPT_RUNNING testen und basierend darauf tun, was Sie wollen.

BEARBEITEN:

Eigentlich gibt es einen viel einfacheren Weg. Im Folgenden wird alles gesagt: Erstellen Sie drei Dateien: ~ / bin / script, ~ / bin / script-shell und ~ / .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] "

Wenn Ihre aktuelle Shell bash ist, vergessen Sie nicht, sie hash -rnach dem Erstellen dieser Dateien auszuführen , um sicherzustellen, dass ~ / bin / script ausgeführt wird, wenn 'script' als Befehl eingegeben wird (überprüfen Sie mit which script).

Beachten Sie nach wie vor, dass Sie ~ / bin in Ihrem PATH vor dem Standardpfad haben müssen, damit dies funktioniert.

Roadowl
quelle