Як дізнатися, чи є ви в машинописі?


11

Я використовую scriptкоманду, щоб зберегти весь вихід з терміналу у файл, який називається typescript. Або script fooзберегти у файл foo.

Скажімо, я продовжую набирати команду після команди, і я забуваю, чи я в машинописі чи ні.

Як я можу дізнатися, чи я в машинопис чи ні?

Відповіді:


7

Можливо, з:

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

Ви можете додати щось на кшталт:

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

Для вашого ~/.zshrcабо ~/.bashrc, тому інформація про те, ви знаходитесь scriptчи ні, буде видно у вашому запиті оболонки.

Крім того, якщо ви не можете гарантувати lsofвстановлення, ви могли б зробити це (якщо не змінити IFS):

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

Евристика , щоб отримати ім'я команди батька лідера сеансу , який зазвичай буде емулятор терміналу ( xterm, script, screen...).


1
@teikakazura, евристична частина полягала в тому, що ви не впевнені, що це буде батьківський процес керівника сесії. Нічого спільного з повторним використанням pid тут, як ваш керівник сесії та його батьків, як правило, все ще існують, коли ви запускаєте цю команду. Можна сказати, що перший є евристичним , а ми лише перевіряємо ім'я процесу. Будь-яка команда, ім'я якої також є scriptта відкрито tty, також спричинить помилковий позитив.
Стефан Шазелас

1
@teikakazura Про (2), який би перевіряв ppid поточної оболонки. Тут ви хочете перевірити ppid лідера сесії (як правило, це оболонка, яка scriptзапустилася).
Стефан Шазелас

Я не можу зрозуміти коментар @StephaneChazelas тут (що таке "(2)", можливо, видалений коментар), але друга частина відповіді дуже цікава, оскільки вона може виявити не тільки, scriptале й інші ситуації, наприклад su -l, sshконсоль Linux та можливо, інші, і надають (через інші аргументи ps) набагато більше інформації.
Стефан Гурішон

5

Цікава проблема. Я знайшов невеликий скрипт bash, який міг би зробити роботу досить надійно:

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

Я думаю, що це дещо інше, ніж запропоновано Стефаном Шазеласом, в тому, що мій сценарій працює на шляху батьківських: дочірніх відносин, які мають процеси Linux / Unix, поки він не знайде PID 1, або не знайде "скрипт" як процес.


4
Цікавий підхід. Однак зауважте, що якщо, наприклад, ви запускаєте xtermз сеансу сценарію, цей скрипт буде містити оболонку в цьому xterm, який працює під сценарієм. Добре це певним чином, але вихід не збирається на машинопис. Мій підхід перевіряє термінал, пов’язаний з поточним сеансом, щоб не було цього питання.
Стефан Шазелас

0

Якщо у вас на шляху є особистий бін / каталог (наприклад, / home / user / bin, розмістіть там скрипт оболонки з назвою 'script' (те саме ім'я, що і двійковий), із таким вмістом:

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

Тепер, під час запуску сценарію, ви можете перевірити змінну середовища SCRIPT_RUNNING і робити все, що завгодно, спираючись на нього.

Редагувати:

Насправді, існує набагато простіший шлях. Нижче сказано все, створіть три файли, ~ / bin / script, ~ / bin / script-shell та ~ / .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] "

Якщо ваша поточна оболонка є bash, не забудьте запустити hash -rпісля створення цих файлів, щоб переконатися, що ~ / bin / script запускається, коли "script" вводиться як команда (позначте which script).

Як і раніше, зауважте, що ви повинні мати ~ / bin у своєму PATH, перед тим як стандартний шлях для цього працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.